﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем ВнутренниеДанные, КлиентскиеПараметры, СвойстваПароля, ПараметрыВыполненияКонтекста;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Элементы.ИнформацияДляПоддержки.Заголовок = ЭлектроннаяПодписьСлужебный.ЗаголовокИнформацииДляПоддержки();
	
	ЭлектроннаяПодписьСлужебный.НастроитьПояснениеВводаПароля(
		ЭтотОбъект, , Элементы.ПояснениеУсиленногоПароля.Имя);
	
	Сертификат = Параметры.Сертификат;
	ПроверкаПриВыборе = Параметры.ПроверкаПриВыборе;
	
	Если ЗначениеЗаполнено(Параметры.ЗаголовокФормы) Тогда
		АвтоЗаголовок = Ложь;
		Заголовок = Параметры.ЗаголовокФормы;
	КонецЕсли;
	
	Если ПроверкаПриВыборе Тогда
		Элементы.ФормаЗакрыть.Заголовок = НСтр("ru = 'Отмена'");
		Элементы.ФормаПроверить.Заголовок = НСтр("ru = 'Проверить и продолжить'");
	КонецЕсли;
	
	ВводитьПароль = Истина;
	СтандартныеПроверки = Истина;
	ОбъединятьРезультаты = ?(Параметры.ОбъединятьРезультаты = "ОбъединятьПоИ"
		Или Параметры.ОбъединятьРезультаты = "ОбъединятьПоИли",
		Параметры.ОбъединятьРезультаты, "НеОбъединять");
	
	Если Параметры.РезультатПроверки <> Неопределено Тогда
		ПроверкаВыполнена = Истина;
		ПроверкиНаКлиенте = Параметры.РезультатПроверки.ПроверкиНаКлиенте;
		ПроверкиНаСервере = Параметры.РезультатПроверки.ПроверкиНаСервере;
		ДополнительныеДанныеПроверокНаСервере = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
			Параметры.РезультатПроверки, "ДополнительныеДанныеПроверокНаСервере", Новый Структура);
		ДополнительныеДанныеПроверокНаКлиенте = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
			Параметры.РезультатПроверки, "ДополнительныеДанныеПроверокНаКлиенте", Новый Структура);
	КонецЕсли;
	
	Проверки = Новый ТаблицаЗначений;
	Проверки.Колонки.Добавить("Имя",           Новый ОписаниеТипов("Строка"));
	Проверки.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
	Проверки.Колонки.Добавить("Подсказка",     Новый ОписаниеТипов("Строка"));
	
	ЭлектроннаяПодписьПереопределяемый.ПриСозданииФормыПроверкаСертификата(
		Параметры.Сертификат, Проверки, Параметры.ПараметрыДополнительныхПроверок,
		СтандартныеПроверки, ВводитьПароль);
		
	Для каждого Проверка Из Проверки Цикл
		
		Группа = ГруппаФормыБезОтображения(
			"Группа" + Проверка.Имя, Элементы.ГруппаДополнительныеПроверки);
		
		ДобавитьКартинку(Проверка.Имя + "НаКлиентеКартинка", Группа);
		ДобавитьКартинку(Проверка.Имя + "НаСервереКартинка", Группа);
		
		ГруппаРезультатИРешение = ГруппаФормыБезОтображения(
			Проверка.Имя + "РезультатИРешение", Группа,
			ГруппировкаПодчиненныхЭлементовФормы.Вертикальная);
			
		Надпись = Элементы.Добавить(Проверка.Имя + "Надпись",
			Тип("ДекорацияФормы"), ГруппаРезультатИРешение);
		Надпись.Заголовок = Проверка.Представление;
		Надпись.РасширеннаяПодсказка.Заголовок = Проверка.Подсказка;
		Надпись.УстановитьДействие("Нажатие", "Подключаемый_НадписьНажатие");
		
		ДобавитьЭлементыОписанияОшибок(Проверка.Имя, ГруппаРезультатИРешение);
		ДобавитьЭлементыОписанияОшибок(Проверка.Имя, ГруппаРезультатИРешение, Истина);
		
		ЗаполнитьЗначенияСвойств(ДополнительныеПроверки.Добавить(), Проверка);
		
		Если ПроверкиНаКлиенте <> Неопределено Тогда
			ВывестиРезультатПроверки(Проверка.Имя);
		КонецЕсли;
		
		Если ПроверкиНаСервере <> Неопределено Тогда
			ВывестиРезультатПроверки(Проверка.Имя, Истина);
		КонецЕсли;
		
	КонецЦикла;
	
	Если Не СтандартныеПроверки Тогда
		
		Если ДополнительныеПроверки.Количество() = 0 Тогда
			ВызватьИсключение
				НСтр("ru = 'Для проверки сертификата отключены стандартные проверки,
				|при этом дополнительных проверок не указано.'");
		КонецЕсли;
			
		Элементы.ГруппаОбщиеПроверки.Видимость = Ложь;
		Элементы.ГруппаПроверкиОпераций.Видимость = Ложь;
		СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, "НестандартныеПроверки");
		
	Иначе
		
		Для Каждого Проверка Из СтандартныеПроверки() Цикл
			Элементы[Проверка + "ОшибкаКлиент"].Видимость = Ложь;
			Элементы[Проверка + "РешениеКлиентНадпись"].Видимость = Ложь;
			Элементы[Проверка + "ОшибкаСервер"].Видимость = Ложь;
			Элементы[Проверка + "РешениеСерверНадпись"].Видимость = Ложь;
			Элементы[Проверка + "Надпись"].Заголовок =
				СтандартныйЗаголовокЭлемента(Проверка + "Надпись");
			
			Если ПроверкиНаКлиенте <> Неопределено Тогда
				ВывестиРезультатПроверки(Проверка);
			КонецЕсли;
			
			Если ПроверкиНаСервере <> Неопределено Тогда
				ВывестиРезультатПроверки(Проверка, Истина);
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЕсли;
	
	СвойстваСертификата = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Сертификат,
		"ДанныеСертификата, Программа, ВводитьПарольВПрограммеЭлектроннойПодписи, Отпечаток, Отозван");
		
	Отозван = СвойстваСертификата.Отозван;
	
	Программа = СвойстваСертификата.Программа;
	АдресСертификата = ПоместитьВоВременноеХранилище(
		СвойстваСертификата.ДанныеСертификата.Получить(), УникальныйИдентификатор);
	СертификатВводитьПарольВПрограммеЭлектроннойПодписи = СвойстваСертификата.ВводитьПарольВПрограммеЭлектроннойПодписи;
	
	ЭтоУчетнаяЗаписьСервиса = ТипЗнч(Программа) = ЭлектроннаяПодписьСлужебный.ТипПрограммыСервисаПодписи()
						И ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи();
	ЭтоВстроенныйКриптопровайдер = Программа = ЭлектроннаяПодписьСлужебный.ВстроенныйКриптопровайдер();
	
	ЕстьУчетнаяЗаписьСервиса = ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи()
			И ЭлектроннаяПодписьСлужебныйВызовСервера.НастроенСервисОблачнойПодписи();
	ЕстьВстроенныйКриптопровайдер = ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса();
		
	Если ЭтоУчетнаяЗаписьСервиса Тогда
		МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный");
		МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSКлиентСервер");
		ДанныеСертификата = МодульСервисКриптографииDSSСлужебный.ПолучитьДанныеСертификатаПоОтпечатку(
								МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(СвойстваСертификата.Отпечаток));
		Если ДанныеСертификата = Неопределено ИЛИ ДанныеСертификата.УчетнаяЗапись <> Программа Тогда
			ВызватьИсключение МодульСервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(Неопределено, "ЧужойСертификат");
		КонецЕсли;
		
		МодульСервисКриптографииDSSПодтверждениеСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSПодтверждениеСервер");
		МодульСервисКриптографииDSSПодтверждениеСервер.ПодготовитьГруппуПодтверждения(ЭтотОбъект, "Проверка", "", "");
		МодульСервисКриптографииDSSПодтверждениеСервер.ПодтверждениеПриИзмененииСертификата(ЭтотОбъект, Сертификат);
		
	ИначеЕсли ЭтоВстроенныйКриптопровайдер 
		Или (Не СтандартныеПроверки И Не ВводитьПароль) Тогда
		Элементы.ГруппаВводаПароля.Видимость = Ложь;
		
	КонецЕсли;
	
	ОбновитьВидимостьНаСервере();
	
	Если СтандартныеПроверки Тогда
		ИмяПервойПроверки = ?(Элементы.ГруппаЗаконныйСертификат.Видимость,
			"ЗаконныйСертификат", "НаличиеСертификата");
	КонецЕсли;
	
	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		Элементы.ГруппаТребуетсяПомощь.Поведение = ПоведениеОбычнойГруппы.Свертываемая;
	КонецЕсли;
	Элементы.ДекорацияПредупреждение.Видимость = Ложь;
	
	СтандартныеПодсистемыСервер.СброситьРазмерыИПоложениеОкна(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если ВнутренниеДанные = Неопределено Тогда
		Отказ = Истина;
	КонецЕсли;
	
	Если ЭтоУчетнаяЗаписьСервиса Тогда
		МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент");
		МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриОткрытии(ЭтотОбъект, Отказ, ЗначениеЗаполнено(Пароль) И ЗапомнитьПароль);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ВРег(ИмяСобытия) = ВРег("Запись_СертификатыКлючейЭлектроннойПодписиИШифрования") И Источник = Сертификат Тогда
		ОбновитьДанныеСертификата();
		Возврат;
	КонецЕсли;
	
	Если ВРег(ИмяСобытия) = ВРег("Установка_КомпонентаExtraCryptoAPI") Тогда
		Элементы.ДекорацияПредупреждение.Видимость = Истина;
		Элементы.ДекорацияПредупреждение.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Установлена компонента %1, выполните проверку заново.'"), "ExtraCryptoAPI");
	КонецЕсли;
	
	// При изменении настроек использования.
	Если ВРег(ИмяСобытия) <> ВРег("Запись_НаборКонстант") Тогда
		Возврат;
	КонецЕсли;
	
	Если ВРег(Источник) = ВРег("ПроверятьЭлектронныеПодписиНаСервере")
		Или ВРег(Источник) = ВРег("СоздаватьЭлектронныеПодписиНаСервере") Тогда
		
		ПодключитьОбработчикОжидания("ПриИзмененияИспользованияПодписанияИлиШифрования", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура Подключаемый_НадписьНажатие(Элемент)
	
	ИмяЭлемента = Лев(Элемент.Имя, СтрДлина(Элемент.Имя) - СтрДлина("Надпись"));
	ИмяОшибки = ИмяЭлемента + "Ошибка";
	
	ПараметрыПредупреждения = Новый Структура;
	ПараметрыПредупреждения.Вставить("ЗаголовокПредупреждения",
		СтандартныйЗаголовокЭлемента(Элемент.Имя));
	ПараметрыПредупреждения.Вставить("ТекстОшибкиКлиент",
		ПроверкиНаКлиенте[ИмяОшибки]);
	ПараметрыПредупреждения.Вставить("ТекстОшибкиСервер",
		?(ОперацииНаСервере Или ЕстьВстроенныйКриптопровайдер Или ЕстьУчетнаяЗаписьСервиса, 
			ПроверкиНаСервере[ИмяОшибки], ""));
			
	ПараметрыПредупреждения.Вставить("ДополнительныеДанные", ДополнительныеДанные(ИмяЭлемента));
	
	ОткрытьФорму("ОбщаяФорма.РасширенноеПредставлениеОшибки",
		ПараметрыПредупреждения, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_НадписьОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьНавигационнуюСсылкуКлассификатора(Элемент,
		НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка, ДополнительныеДанные());
КонецПроцедуры

&НаКлиенте
Процедура ПарольПриИзменении(Элемент)
	
	ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект,
		ВнутренниеДанные, СвойстваПароля, Новый Структура("ПриИзмененииРеквизитаПароль", Истина));
	
КонецПроцедуры

&НаКлиенте
Процедура ЗапомнитьПарольПриИзменении(Элемент)
	
	ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект,
		ВнутренниеДанные, СвойстваПароля, Новый Структура("ПриИзмененииРеквизитаЗапомнитьПароль", Истина));
	
КонецПроцедуры

&НаКлиенте
Процедура ПояснениеУстановленногоПароляНажатие(Элемент)
	
	ЭлектроннаяПодписьСлужебныйКлиент.ПояснениеУстановленногоПароляНажатие(ЭтотОбъект, Элемент, СвойстваПароля);
	
КонецПроцедуры

&НаКлиенте
Процедура ПояснениеУстановленногоПароляРасширеннаяПодсказкаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
	
	ЭлектроннаяПодписьСлужебныйКлиент.ПояснениеУстановленногоПароляОбработкаНавигационнойСсылки(
		ЭтотОбъект, Элемент, НавигационнаяСсылка, СтандартнаяОбработка, СвойстваПароля);
	
КонецПроцедуры

&НаКлиенте
Процедура ИнформацияДляПоддержкиОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;

	Если НавигационнаяСсылка = "ТипичныеПроблемы" Тогда
		ЭлектроннаяПодписьКлиент.ОткрытьИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами();
		Возврат;
	КонецЕсли;
	
	Если Не ПроверкаВыполнена Тогда
		ПоказатьПредупреждение(,
			НСтр("ru = 'Для сбора технической информации о возникшей проблеме выполните проверку сертификата.'"));
		Возврат;
	КонецЕсли;
	
	СоставПроверок = СтандартныеПроверки();
	Для Каждого Проверка Из ДополнительныеПроверки Цикл
		СоставПроверок.Добавить(Проверка.Имя);
	КонецЦикла;
	
	ТекстОшибок = "";
	ОписаниеФайлов = Новый Массив;
	ЭлектроннаяПодписьСлужебныйВызовСервера.ДобавитьОписаниеДополнительныхДанных(
		Новый Структура("Сертификат", Сертификат), ОписаниеФайлов, ТекстОшибок);
	
	ТекстОшибок = ТекстОшибок + НСтр("ru = 'Результат проверки на клиенте'") + ":" + Символы.ПС;
	ДополнитьТекстОшибками(ТекстОшибок, СоставПроверок);
	
	ТекстОшибок = ТекстОшибок + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Результат проверки на сервере ""%1"":'"), ИмяСервера) + Символы.ПС;
	ДополнитьТекстОшибками(ТекстОшибок, СоставПроверок, Истина);
	
	ЭлектроннаяПодписьСлужебныйКлиент.СформироватьТехническуюИнформацию(
		ТекстОшибок, Неопределено, ОписаниеФайлов);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Проверить(Команда)
	
	Элементы.ДекорацияПредупреждение.Видимость = Ложь;
	Элементы.ФормаПроверить.Доступность = Ложь;
	Элементы.ФормаПроверить.Отображение = ОтображениеКнопки.КартинкаИТекст;
	ПроверитьСертификат(Новый ОписаниеОповещения("ПроверитьЗавершение", ЭтотОбъект));
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Продолжение процедуры Проверить.
&НаКлиенте
Процедура ПроверитьЗавершение(Неопределен, Контекст) Экспорт
	
	Элементы.ФормаПроверить.Доступность = Истина;
	Элементы.ФормаПроверить.Отображение = ОтображениеКнопки.Текст;
	
	Если Не ПроверкаПриВыборе Тогда
		Возврат;
	КонецЕсли;
	
	Если КлиентскиеПараметры.Результат.ПроверкиПройдены Тогда
		Закрыть(Истина);
	Иначе
		ПоказатьПредупреждениеОНевозможностиПродолжения();
	КонецЕсли;
	
КонецПроцедуры

// АПК:78-выкл: для безопасной передачи данных на клиенте между формами, не отправляя их на сервер.
&НаКлиенте
Процедура ПродолжитьОткрытие(Оповещение, ОбщиеВнутренниеДанные, ВходящиеКлиентскиеПараметры) Экспорт
// АПК:78-вкл: для безопасной передачи данных на клиенте между формами, не отправляя их на сервер.
	
	ВнутренниеДанные = ОбщиеВнутренниеДанные;
	КлиентскиеПараметры = ВходящиеКлиентскиеПараметры;
	КлиентскиеПараметры.Вставить("Результат");
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ПриОткрытии", Истина);
	Если КлиентскиеПараметры.Свойство("УказанКонтекстДругойОперации") Тогда
		
		СвойстваСертификата = ОбщиеВнутренниеДанные;
		КлиентскиеПараметры.КонтекстОперации.ПродолжитьОткрытие(
			Неопределено, Неопределено, СвойстваСертификата);
		
		Если СвойстваСертификата.Сертификат = Сертификат Тогда
			СвойстваПароля = СвойстваСертификата.СвойстваПароля;
		КонецЕсли;
		
		ДополнительныеПараметры.Вставить("ПарольУказан");
		ДополнительныеПараметры.Вставить("ПриУстановкеПароляИзДругойОперации", Истина);
		
	КонецЕсли;
	
	ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект,
		ВнутренниеДанные, СвойстваПароля, ДополнительныеПараметры);
	
	Элементы.ЗапомнитьПароль.Доступность = Элементы.Пароль.Доступность;
	Если Не Элементы.Пароль.Доступность Тогда
		ТекущийЭлемент = Элементы.ФормаПроверить;
	КонецЕсли;
	
	Если КлиентскиеПараметры.Свойство("БезПодтверждения")
		И КлиентскиеПараметры.БезПодтверждения
		И (ДополнительныеПараметры.ПарольУказан
		Или ДополнительныеПараметры.ВводитьПарольВПрограммеЭлектроннойПодписи) Тогда
		
		Если Не КлиентскиеПараметры.Свойство("ОбработкаРезультата")
			Или ТипЗнч(КлиентскиеПараметры.ОбработкаРезультата) <> Тип("ОписаниеОповещения") Тогда
			
			Открыть();
		КонецЕсли;
		
		Контекст = Новый Структура("Оповещение", Оповещение);
		ПроверитьСертификат(Новый ОписаниеОповещения(
			"ПродолжитьОткрытиеПослеПроверкиСертификата", ЭтотОбъект, Контекст));
		
		Возврат;
		
	КонецЕсли;
	
	Открыть();
	
	ВыполнитьОбработкуОповещения(Оповещение);
	
КонецПроцедуры

// Продолжение процедуры ПродолжитьОткрытие.
&НаКлиенте
Процедура ПродолжитьОткрытиеПослеПроверкиСертификата(Результат, Контекст) Экспорт
	
	Если КлиентскиеПараметры.Результат.ПроверкиПройдены Тогда
		ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
		Возврат;
	КонецЕсли;
	
	Если Не Открыта()
		И Не (КлиентскиеПараметры.Свойство("НеПоказыватьРезультаты")
		И КлиентскиеПараметры.НеПоказыватьРезультаты) Тогда
		
		Открыть();
	КонецЕсли;
	
	Если ПроверкаПриВыборе Тогда
		ПоказатьПредупреждениеОНевозможностиПродолжения();
	КонецЕсли;
	
	ВыполнитьОбработкуОповещения(Контекст.Оповещение);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененияИспользованияПодписанияИлиШифрования()
	
	ОбновитьВидимостьНаСервере()
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьПредупреждениеОНевозможностиПродолжения()
	
	ПоказатьПредупреждение(,
		НСтр("ru = 'Не удалось продолжить, т.к. пройдены не все требуемые проверки.'"));
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСертификат(Оповещение)
	
	ПарольПринят = Ложь;
	ПроверкиНаКлиенте = Новый Структура;
	ПроверкиНаСервере = Новый Структура;
	ДополнительныеДанныеПроверокНаКлиенте = Новый Структура;
	ДополнительныеДанныеПроверокНаСервере = Новый Структура;
	
	// Очистка предыдущих результатов проверки.
	Если СтандартныеПроверки Тогда
		
		ОсновныеПроверки = СтандартныеПроверки();
		Если Не ЭтоВстроенныйКриптопровайдер Тогда
			ОсновныеПроверки.Добавить("НаличиеПрограммы");
		КонецЕсли;
		
		Для каждого Проверка Из ОсновныеПроверки Цикл
			УстановитьЭлемент(ЭтотОбъект, Проверка, Ложь, , , ОбъединятьРезультаты);
			УстановитьЭлемент(ЭтотОбъект, Проверка, Истина, , , ОбъединятьРезультаты);
		КонецЦикла;
		
	КонецЕсли;
	
	Для каждого Проверка Из ДополнительныеПроверки Цикл
		УстановитьЭлемент(ЭтотОбъект, Проверка.Имя, Ложь, , , ОбъединятьРезультаты);
		УстановитьЭлемент(ЭтотОбъект, Проверка.Имя, Истина, , , ОбъединятьРезультаты);
	КонецЦикла;
	
	Контекст = Новый Структура("Оповещение", Оповещение);
	
	ПроверитьНаСторонеКлиента(Новый ОписаниеОповещения(
		"ПроверитьСертификатПослеПроверкиНаКлиенте", ЭтотОбъект, Контекст));
	
КонецПроцедуры

// Продолжение процедуры ПроверитьСертификат.
&НаКлиенте
Процедура ПроверитьСертификатПослеПроверкиНаКлиенте(Результат, Контекст) Экспорт
	
	Если ЭтоВстроенныйКриптопровайдер Или ЭтоУчетнаяЗаписьСервиса Тогда
		
		Если ОперацииНаСервере Тогда
			ПроверитьНаСторонеСервераДополнительныеПроверки(СвойстваПароля.Значение);
		КонецЕсли;
		
		Если СтандартныеПроверки Тогда
			Оповещение = Новый ОписаниеОповещения("ПроверитьСертификатПослеПроверкиНаКлиентеИСервере", ЭтотОбъект,
				Контекст);
			НовыйКонтекст = Новый Структура;
			НовыйКонтекст.Вставить("ПроверкаНаКлиентеСертификатаСервиса", Истина);
			НовыйКонтекст.Вставить("ПроверкаВСервисеВместоПроверкиНаСервере", Ложь);
			ПроверитьНаСторонеКлиента(Оповещение, НовыйКонтекст);
		Иначе
			ПроверитьСертификатПослеПроверкиНаКлиентеИСервере(Результат, Контекст);
		КонецЕсли;
		
	Иначе
		
		ПроверитьВСервисеВместоПроверкиНаСервере = СтандартныеПроверки
			И ПроверятьЭлектронныеПодписиНаСервере
			И (ЕстьВстроенныйКриптопровайдер Или ЕстьУчетнаяЗаписьСервиса)
			И Не ОперацииНаСервере;
		
		Если ПроверитьВСервисеВместоПроверкиНаСервере Тогда
			
			Если ОперацииНаСервере Тогда
				ПроверитьНаСторонеСервераДополнительныеПроверки(СвойстваПароля.Значение);
			КонецЕсли;
			
			Если СтандартныеПроверки И ОперацияАктивна() Тогда
				Оповещение = Новый ОписаниеОповещения("ПроверитьСертификатПослеПроверкиНаКлиентеИСервере", ЭтотОбъект,
					Контекст);
				НовыйКонтекст = Новый Структура;
				НовыйКонтекст.Вставить("ПроверкаВСервисеВместоПроверкиНаСервере", Истина);
				НовыйКонтекст.Вставить("ПроверкаНаКлиентеСертификатаСервиса", Ложь);
				ПроверитьНаСторонеКлиента(Оповещение, НовыйКонтекст);
			Иначе
				ПроверитьСертификатПослеПроверкиНаКлиентеИСервере(Результат, Контекст);
			КонецЕсли;
			
		Иначе
			Если ОперацииНаСервере Тогда
				Если СтандартныеПроверки Тогда
					ПроверитьНаСторонеСервера(СвойстваПароля.Значение);
				Иначе
					ПроверитьНаСторонеСервераДополнительныеПроверки(СвойстваПароля.Значение);
				КонецЕсли;
			КонецЕсли;
			ПроверитьСертификатПослеПроверкиНаКлиентеИСервере(Результат, Контекст);
		КонецЕсли;
		
	КонецЕсли;
		
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСертификатПослеПроверкиНаКлиентеИСервере(Результат, Контекст) Экспорт
	
	Если ПарольПринят Тогда
		ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект,
			ВнутренниеДанные, СвойстваПароля, Новый Структура("ПриУспешномВыполненииОперации", Истина));
	КонецЕсли;
	
	Результат = Новый Структура;
	Результат.Вставить("ПроверкиПройдены", Ложь);
	Результат.Вставить("ПроверкиНаКлиенте", ПроверкиНаКлиенте);
	Результат.Вставить("ПроверкиНаСервере", ПроверкиНаСервере);
	Результат.Вставить("ДополнительныеДанныеПроверокНаКлиенте", ДополнительныеДанныеПроверокНаКлиенте);
	Результат.Вставить("ДополнительныеДанныеПроверокНаСервере", ДополнительныеДанныеПроверокНаСервере);
	
	КлиентскиеПараметры.Вставить("Результат", Результат);
	
	Если КлиентскиеПараметры.Свойство("ОбработкаРезультата")
	   И ТипЗнч(КлиентскиеПараметры.ОбработкаРезультата) = Тип("ОписаниеОповещения") Тогда
		
		ВыполнитьОбработкуОповещения(КлиентскиеПараметры.ОбработкаРезультата, Результат.ПроверкиПройдены);
	КонецЕсли;
	
	ВыполнитьОбработкуОповещения(Контекст.Оповещение);
	
КонецПроцедуры

#Область ПроверкаНаКлиенте

&НаКлиенте
Процедура ПроверитьНаСторонеКлиента(Оповещение, Контекст = Неопределено)
	
	ПроверкаВыполнена = Истина;
	Если Контекст = Неопределено Тогда
		Контекст = Новый Структура;
		Контекст.Вставить("ПроверкаВСервисеВместоПроверкиНаСервере", Ложь);
		Контекст.Вставить("ПроверкаНаКлиентеСертификатаСервиса", Ложь);
	КонецЕсли;
	
	Контекст.Вставить("Оповещение", Оповещение);
	
	Если СтандартныеПроверки Тогда
		ЭлектроннаяПодписьКлиент.УстановитьРасширение(Ложь, Новый ОписаниеОповещения(
			"ПроверитьНаСторонеКлиентаПослеПодключенияРасширенияРаботыСКриптографией", ЭтотОбъект, Контекст),
			НСтр("ru = 'Для продолжения установите расширение для работы с криптографией.'"));
	Иначе
		Контекст.Вставить("МенеджерКриптографии", Неопределено);
		ПроверитьНаСторонеКлиентаДополнительныеПроверки(Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеПодключенияРасширенияРаботыСКриптографией(Подключено, Контекст) Экспорт
	
	ДанныеСертификата = ПолучитьИзВременногоХранилища(АдресСертификата);
	Контекст.Вставить("АлгоритмПодписи",
		ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписиСертификата(ДанныеСертификата));
	
	Если Подключено <> Истина Тогда
		
		ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыСозданияМенеджераКриптографии();
		ПараметрыСоздания.ПоказатьОшибку = Ложь;
		ПараметрыСоздания.АлгоритмПодписи = Контекст.АлгоритмПодписи;
		
		ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
				"ПроверитьНаСторонеКлиентаПослеПопыткиСозданияМенеджераКриптографии", ЭтотОбъект, Контекст),
			"ПроверкаСертификата", ПараметрыСоздания);
		
		Возврат;
		
	КонецЕсли;
	
	// Проверка данных сертификата.
	Контекст.Вставить("ДанныеСертификата", ДанныеСертификата);
	
	СертификатКриптографии = Новый СертификатКриптографии;
	СертификатКриптографии.НачатьИнициализацию(Новый ОписаниеОповещения(
			"ПроверитьНаСторонеКлиентаПослеИнициализацииСертификата", ЭтотОбъект, Контекст,
			"ПроверитьНаСторонеКлиентаПослеОшибкиИнициализацииСертификата", ЭтотОбъект),
		Контекст.ДанныеСертификата);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеПопыткиСозданияМенеджераКриптографии(Результат, Контекст) Экспорт
	
	УстановитьЭлемент(ЭтотОбъект, ИмяПервойПроверки, Ложь, Результат, Ложь, ОбъединятьРезультаты);
	ВыполнитьОбработкуОповещения(Контекст.Оповещение);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеОшибкиИнициализацииСертификата(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
	
	СтандартнаяОбработка = Ложь;
	
	ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
	УстановитьЭлемент(ЭтотОбъект, ИмяПервойПроверки, Ложь, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	ВыполнитьОбработкуОповещения(Контекст.Оповещение);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеИнициализацииСертификата(СертификатКриптографии, Контекст) Экспорт
	
	Контекст.Вставить("СертификатКриптографии", СертификатКриптографии);
	
	// Законный сертификат.
	ПроверитьЗаконныйСертификатНаКлиенте(Контекст);
	
	Контекст.Вставить("ЭтоОперацияВСервисе", Ложь);
	
	// Наличие сертификата в личном списке.
	Если ЭтоУчетнаяЗаписьСервиса И Не Контекст.ПроверкаНаКлиентеСертификатаСервиса Тогда
		
		Контекст.Вставить("ЭтоОперацияВСервисе", Истина);
		ОповещениеСледующее = Новый ОписаниеОповещения("ПроверитьНаСторонеКлиентаПослеАвторизацииВОблачнойПодписи", ЭтотОбъект, Контекст);
		МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент");
		МодульСервисКриптографииDSSКлиент.ПроверкаАутентификацииПользователя(ОповещениеСледующее, Программа);
		
	ИначеЕсли ЕстьУчетнаяЗаписьСервиса И Контекст.ПроверкаВСервисеВместоПроверкиНаСервере Тогда
		
		Контекст.Вставить("ЭтоОперацияВСервисе", Истина);
		Контекст.Вставить("НастройкиПользователя", Неопределено);
		ОповещениеСледующее = Новый ОписаниеОповещения(
				"ПроверитьНаСторонеКлиентаПослеПроверкиСертификатаОблачнойПодписи", ЭтотОбъект, Контекст);
		МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент");
		МодульСервисКриптографииDSSКлиент.ПроверитьСертификат(ОповещениеСледующее, Контекст.НастройкиПользователя, Контекст.ДанныеСертификата);
		
	ИначеЕсли ЭтоВстроенныйКриптопровайдер И Не Контекст.ПроверкаНаКлиентеСертификатаСервиса Тогда
		
		Контекст.Вставить("ЭтоОперацияВСервисе", Истина);
		СтруктураПоиска = Новый Структура;
		СтруктураПоиска.Вставить("Отпечаток", Контекст.СертификатКриптографии.Отпечаток);
		МодульХранилищеСертификатовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ХранилищеСертификатовКлиент");
		МодульХранилищеСертификатовКлиент.НайтиСертификат(Новый ОписаниеОповещения(
			"ПроверитьНаСторонеКлиентаПослеПоискаСертификатаВМоделиСервиса", ЭтотОбъект, Контекст), СтруктураПоиска);
	ИначеЕсли ЕстьВстроенныйКриптопровайдер И Контекст.ПроверкаВСервисеВместоПроверкиНаСервере Тогда
		
		Контекст.Вставить("ЭтоОперацияВСервисе", Истина);
		// Проверка данных сертификата.
		МодульСервисКриптографииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииКлиент");
			
		МодульСервисКриптографииКлиент.ПроверитьСертификат(Новый ОписаниеОповещения(
			"ПроверитьНаСторонеКлиентаПослеПроверкиСертификатаВМоделиСервиса", ЭтотОбъект, Контекст),
			Контекст.ДанныеСертификата);
	Иначе
		Если Контекст.ПроверкаНаКлиентеСертификатаСервиса Тогда
			ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыСозданияМенеджераКриптографии();
			ПараметрыСоздания.АлгоритмПодписи = Контекст.АлгоритмПодписи;
			ПараметрыСоздания.ПоказатьОшибку = Ложь;
	
			// Проверка данных сертификата.
			ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(
				Новый ОписаниеОповещения("ПроверитьНаСторонеКлиентаПослеСозданияЛюбогоМенеджераКриптографии",
				ЭтотОбъект, Контекст), "ПроверкаСертификата", ПараметрыСоздания);
		Иначе
			ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьСертификатПоОтпечатку(Новый ОписаниеОповещения(
				"ПроверитьНаСторонеКлиентаПослеПоискаСертификата", ЭтотОбъект, Контекст),
				Base64Строка(Контекст.СертификатКриптографии.Отпечаток), Истина, Неопределено);
		КонецЕсли;	
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьЗаконныйСертификатНаКлиенте(Контекст)
	
	Если Не Элементы.ГруппаЗаконныйСертификат.Видимость
	 Или Контекст.СертификатКриптографии.Субъект.Свойство("SN") Тогда
		
		ОписаниеОшибки = "";
	Иначе
		ОписаниеОшибки = НСтр("ru = 'В описании субъекта сертификата не найдено поле ""SN"".'");
	КонецЕсли;
	УстановитьЭлемент(ЭтотОбъект, "ЗаконныйСертификат", Ложь, ОписаниеОшибки, , ОбъединятьРезультаты);

КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеПоискаСертификата(Результат, Контекст) Экспорт
	
	Если ТипЗнч(Результат) = Тип("СертификатКриптографии") Тогда
		УстановитьЭлемент(ЭтотОбъект, "НаличиеСертификата", Ложь, "", , ОбъединятьРезультаты);
	Иначе
		УстановитьЭлемент(ЭтотОбъект, "НаличиеСертификата", Ложь,
			?(ТипЗнч(Результат) = Тип("Строка"), Результат, Результат.ОписаниеОшибки) + Символы.ПС + Символы.ПС
			+ НСтр("ru = 'Проверка подписания, созданной подписи и расшифровки не могут быть выполнены.'"),
			Истина, ОбъединятьРезультаты);
	КонецЕсли;
	
	ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыСозданияМенеджераКриптографии();
	ПараметрыСоздания.АлгоритмПодписи = Контекст.АлгоритмПодписи;
	ПараметрыСоздания.ПоказатьОшибку = Ложь;
	
	// Проверка данных сертификата.
	ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
		"ПроверитьНаСторонеКлиентаПослеСозданияЛюбогоМенеджераКриптографии", ЭтотОбъект, Контекст),
		"ПроверкаСертификата", ПараметрыСоздания);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
// 
// Параметры:
//  Результат - Структура:
//   * ОписаниеОшибки - Структура:
//      ** Описание - Строка
//
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеПоискаСертификатаВМоделиСервиса(Результат, Контекст) Экспорт
	
	ОписаниеОшибки = "";
	Если Не Результат.Выполнено Тогда
		ОписаниеОшибки = Результат.ОписаниеОшибки.Описание;
	ИначеЕсли Не ЗначениеЗаполнено(Результат.Сертификат) Тогда
		ОписаниеОшибки = НСтр("ru = 'Сертификат отсутствует в сервисе (возможно удален).'");
	КонецЕсли;
	Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
		ОписаниеОшибки = ОписаниеОшибки + Символы.ПС
			+ НСтр("ru = 'Проверка подписания, созданной подписи и расшифровки не могут быть выполнены.'");
	КонецЕсли;
	УстановитьЭлемент(ЭтотОбъект, "НаличиеСертификата", Истина, ОписаниеОшибки, , ОбъединятьРезультаты);
	
	// Если не нашли сертификат в хранилище сертификатов, проверки прекращаются.
	Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
		ВыполнитьОбработкуОповещения(Контекст.Оповещение);
		Возврат;
	КонецЕсли;
	
	// Проверка данных сертификата.
	МодульСервисКриптографииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииКлиент");
		
	МодульСервисКриптографииКлиент.ПроверитьСертификат(Новый ОписаниеОповещения(
			"ПроверитьНаСторонеКлиентаПослеПроверкиСертификатаВМоделиСервиса", ЭтотОбъект, Контекст),
			Результат.Сертификат.Сертификат);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеСозданияЛюбогоМенеджераКриптографии(Результат, Контекст) Экспорт
	
	Если ТипЗнч(Результат) = Тип("МенеджерКриптографии") Тогда
		ДополнительныеПараметрыПроверок = ЭлектроннаяПодписьСлужебныйКлиент.ДополнительныеПараметрыПроверкиСертификата();
		ДополнительныеПараметрыПроверок.ВыполнятьПроверкуУдостоверяющегоЦентра = Ложь;
		ДополнительныеПараметрыПроверок.ОбъединитьОшибкиДанныхСертификата = Ложь;
		ДополнительныеПараметрыПроверок.ПроверитьВСервисеПослеОшибки = Ложь;
		ЭлектроннаяПодписьСлужебныйКлиент.ПроверитьСертификат(Новый ОписаниеОповещения(
				"ПроверитьНаСторонеКлиентаПослеПроверкиСертификата", ЭтотОбъект, Контекст),
			Контекст.СертификатКриптографии, Результат,,ДополнительныеПараметрыПроверок);
	Иначе
		ПроверитьНаСторонеКлиентаПослеПроверкиСертификата(Результат, Контекст)
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Асинх Процедура ПроверитьНаСторонеКлиентаПослеПроверкиСертификата(Результат, Контекст) Экспорт
	
	Если Результат = Истина Тогда
		ОписаниеОшибкиНаКлиенте = "";
	ИначеЕсли ТипЗнч(Результат) = Тип("Структура") Тогда
		ОписаниеОшибкиНаКлиенте = Результат.ОписаниеОшибкиНаКлиенте;
	Иначе
		ОписаниеОшибкиНаКлиенте = Результат;
	КонецЕсли;
	
	УстановитьЭлемент(ЭтотОбъект, "ДанныеСертификата", Ложь, ОписаниеОшибкиНаКлиенте, Истина, ОбъединятьРезультаты);
	
	Если Контекст.ПроверкаНаКлиентеСертификатаСервиса Тогда
		ВыполнитьОбработкуОповещения(Контекст.Оповещение);
		Возврат;
	КонецЕсли;
	
	// Наличие программы
	Если ЗначениеЗаполнено(Программа) Тогда
		
		ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыСозданияМенеджераКриптографии();
		ПараметрыСоздания.Программа = Программа;
		ПараметрыСоздания.ПоказатьОшибку = Ложь;
		ПараметрыСоздания.ИнтерактивныйРежим = СертификатВводитьПарольВПрограммеЭлектроннойПодписи;
		
		ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
				"ПроверитьНаСторонеКлиентаПослеСозданияМенеджераКриптографии", ЭтотОбъект, Контекст),
			"ПроверкаСертификата", ПараметрыСоздания);
		
	Иначе
		
		ПрограммаАвтоНаКлиентеРезультат = Ждать ЭлектроннаяПодписьСлужебныйКлиент.ПрограммаПоСертификату(
			АдресСертификата);
		ПрограммаАвтоНаКлиенте = ПрограммаАвтоНаКлиентеРезультат.Программа;
		Если ПрограммаАвтоНаКлиентеРезультат.Программа = Неопределено Тогда
			ОписаниеОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиНеУдалосьОпределитьПрограмму(
				ПрограммаАвтоНаКлиентеРезультат.Ошибка);
			ПроверитьНаСторонеКлиентаПослеСозданияМенеджераКриптографии(ОписаниеОшибки, Контекст);
		Иначе
			ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыСозданияМенеджераКриптографии();
			ПараметрыСоздания.Программа = ПрограммаАвтоНаКлиенте;
			ПараметрыСоздания.ПоказатьОшибку = Ложь;
			ПараметрыСоздания.ИнтерактивныйРежим = СертификатВводитьПарольВПрограммеЭлектроннойПодписи;

			ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(
				Новый ОписаниеОповещения("ПроверитьНаСторонеКлиентаПослеСозданияМенеджераКриптографии", ЭтотОбъект,
				Контекст), "ПроверкаСертификата", ПараметрыСоздания);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
// 
// Параметры:
//  Результат - Структура:
//   * ИнформацияОбОшибке - Структура:
//      ** Описание - Строка
//  Контекст - Структура
//
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеПроверкиСертификатаВМоделиСервиса(Результат, Контекст) Экспорт
	
	Если Результат.Выполнено И Результат.Действителен Тогда
		ОписаниеОшибки = "";
	Иначе
		ОписаниеОшибки = Результат.ИнформацияОбОшибке.Описание;
	КонецЕсли;
	
	УстановитьЭлемент(ЭтотОбъект, "ДанныеСертификата", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	Если Контекст.ПроверкаВСервисеВместоПроверкиНаСервере Тогда
		ВыполнитьОбработкуОповещения(Контекст.Оповещение);
		Возврат;
	КонецЕсли;
	
	// Наличие программы
	Если ЗначениеЗаполнено(Программа) Тогда
		ПроверитьНаСторонеКлиентаВМоделиСервиса("СервисКриптографии", Контекст);
	Иначе
		ОписаниеОшибки = НСтр("ru = 'Программа для использования закрытого ключа не указана в сертификате.'");
		ПроверитьНаСторонеКлиентаПослеСозданияМенеджераКриптографии(ОписаниеОшибки, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Асинх Процедура ПроверитьНаСторонеКлиентаПослеСозданияМенеджераКриптографии(Результат, Контекст) Экспорт
	
	Контекст.Вставить("МенеджерКриптографии", Неопределено);
	
	Если ТипЗнч(Результат) = Тип("МенеджерКриптографии") Тогда
		Контекст.МенеджерКриптографии = Результат;
		ОписаниеОшибки = "";
	Иначе
		ОписаниеОшибки = Результат + Символы.ПС + Символы.ПС
			+ НСтр("ru = 'Проверка подписания, созданной подписи, шифрования и
			             |расшифровки не могут быть выполнены.'");
	КонецЕсли;
	УстановитьЭлемент(ЭтотОбъект, "НаличиеПрограммы", Контекст.ЭтоОперацияВСервисе, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	Если Контекст.МенеджерКриптографии = Неопределено Тогда
		ВыполнитьОбработкуОповещения(Контекст.Оповещение);
		Возврат;
	КонецЕсли;
	
	Если Не ЭлектроннаяПодписьСлужебныйКлиент.ИспользуетсяИнтерактивныйРежимКриптографии(Контекст.МенеджерКриптографии) Тогда
		Контекст.МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = СвойстваПароля.Значение;
	КонецЕсли;
	
	ОписаниеОшибки = Ждать ДополнительнаяПроверкаНаВозможностьПодписания(Контекст.СертификатКриптографии, Ложь);
		
	// Подписание.
	Если ПроверкиНаКлиенте.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		Контекст.МенеджерКриптографии.НачатьПодписывание(Новый ОписаниеОповещения(
				"ПроверитьНаСторонеКлиентаПослеПодписания", ЭтотОбъект, Контекст,
				"ПроверитьНаСторонеКлиентаПослеОшибкиПодписания", ЭтотОбъект),
			Контекст.ДанныеСертификата, Контекст.СертификатКриптографии);
	Иначе
		ПроверитьНаСторонеКлиентаПослеПодписания(Null, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Асинх Процедура ПроверитьНаСторонеКлиентаВМоделиСервиса(Результат, Контекст)
	
	Контекст.Вставить("МенеджерКриптографии", Неопределено);
	
	Если ТипЗнч(Результат) = Тип("Строка") И Результат = "СервисКриптографии" Тогда
		Контекст.МенеджерКриптографии = Результат;
		ОписаниеОшибки = "";
	Иначе
		ОписаниеОшибки = Результат + Символы.ПС + Символы.ПС
			+ НСтр("ru = 'Проверка подписания, созданной подписи, шифрования и
			             |расшифровки не могут быть выполнены.'");
	КонецЕсли;
	УстановитьЭлемент(ЭтотОбъект, "НаличиеПрограммы", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	Если Контекст.МенеджерКриптографии = Неопределено Тогда
		ВыполнитьОбработкуОповещения(Контекст.Оповещение);
		Возврат;
	КонецЕсли;
	
	ОписаниеОшибки = Ждать ДополнительнаяПроверкаНаВозможностьПодписания(Контекст.СертификатКриптографии, Истина);
	
	// Подписание.
	Если ПроверкиНаКлиенте.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		МодульСервисКриптографииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииКлиент");
		МодульСервисКриптографииКлиент.Подписать(Новый ОписаниеОповещения(
				"ПроверитьНаСторонеКлиентаПослеПодписанияВМоделиСервиса", ЭтотОбъект, Контекст,
				"ПроверитьНаСторонеКлиентаПослеОшибкиПодписания", ЭтотОбъект),
			Контекст.ДанныеСертификата, Контекст.ДанныеСертификата);
	Иначе
		ПроверитьНаСторонеКлиентаПослеПодписанияВМоделиСервиса(Null, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеОшибкиПодписания(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
	
	СтандартнаяОбработка = Ложь;
	ПроверитьНаСторонеКлиентаПослеПодписания(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеПодписания(ДанныеПодписи, Контекст) Экспорт
	
	Если ДанныеПодписи <> Null Тогда
		Если ТипЗнч(ДанныеПодписи) = Тип("Строка") Тогда
			ОписаниеОшибки = ДанныеПодписи;
		Иначе
			ОписаниеОшибки = "";
			ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДанныеПодписи, ОписаниеОшибки);
		КонецЕсли;
		Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
			ПарольПринят = Истина;
		КонецЕсли;
		УстановитьЭлемент(ЭтотОбъект, "Подписание", Контекст.ЭтоОперацияВСервисе, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	КонецЕсли;
	
	// Проверка подписи.
	Если ДанныеПодписи <> Null И ПроверкиНаКлиенте.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		Контекст.МенеджерКриптографии.НачатьПроверкуПодписи(Новый ОписаниеОповещения(
				"ПроверитьНаСторонеКлиентаПослеПроверкиПодписи", ЭтотОбъект, Контекст,
				"ПроверитьНаСторонеКлиентаПослеОшибкиПроверкиПодписи", ЭтотОбъект),
			Контекст.ДанныеСертификата, ДанныеПодписи);
	Иначе
		ПроверитьНаСторонеКлиентаПослеПроверкиПодписи(Null, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
// 
// Параметры:
//  ДанныеПодписи - Структура:
//   * ИнформацияОбОшибке - Структура:
//      ** Описание - Строка
//  Контекст - Структура
//
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеПодписанияВМоделиСервиса(ДанныеПодписи, Контекст) Экспорт
	
	Если ТипЗнч(ДанныеПодписи) = Тип("Структура") Тогда
		Если Не ДанныеПодписи.Выполнено Тогда
			ОписаниеОшибки = ДанныеПодписи.ИнформацияОбОшибке.Описание;
		Иначе
			ОписаниеОшибки = "";
			ДанныеПодписи = ДанныеПодписи.Подпись;
			ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДанныеПодписи, ОписаниеОшибки);
		КонецЕсли;
		Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
			ПарольПринят = Истина;
		КонецЕсли;
		УстановитьЭлемент(ЭтотОбъект, "Подписание", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	КонецЕсли;
	
	// Проверка подписи.
	Если ДанныеПодписи <> Null И ПроверкиНаСервере.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		МодульСервисКриптографииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииКлиент");
		МодульСервисКриптографииКлиент.ПроверитьПодпись(Новый ОписаниеОповещения(
					"ПроверитьНаСторонеКлиентаПослеПроверкиПодписиВМоделиСервиса", ЭтотОбъект, Контекст,
					"ПроверитьНаСторонеКлиентаПослеОшибкиПроверкиПодписи", ЭтотОбъект),
				ДанныеПодписи, Контекст.ДанныеСертификата);
	Иначе
		ПроверитьНаСторонеКлиентаПослеПроверкиПодписиВМоделиСервиса(Null, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеОшибкиПроверкиПодписи(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
	
	СтандартнаяОбработка = Ложь;
	ПроверитьНаСторонеКлиентаПослеПроверкиПодписи(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеПроверкиПодписи(Сертификат, Контекст) Экспорт
	
	Если Сертификат <> Null Тогда
		Если ТипЗнч(Сертификат) = Тип("Строка") Тогда
			ОписаниеОшибки = Сертификат;
		Иначе
			ОписаниеОшибки = "";
		КонецЕсли;
		УстановитьЭлемент(ЭтотОбъект, "ПроверкаПодписи", Ложь, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	КонецЕсли;
	
	Контекст.МенеджерКриптографии.НачатьШифрование(Новый ОписаниеОповещения(
			"ПроверитьНаСторонеКлиентаПослеШифрования", ЭтотОбъект, Контекст,
			"ПроверитьНаСторонеКлиентаПослеОшибкиШифрования", ЭтотОбъект),
		Контекст.ДанныеСертификата, Контекст.СертификатКриптографии);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
// 
// Параметры:
//  Результат - Структура:
//   * ИнформацияОбОшибке - Структура:
//      ** Описание - Строка
//  Контекст - Структура
//
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеПроверкиПодписиВМоделиСервиса(Результат, Контекст) Экспорт
	
	Если ТипЗнч(Результат) = Тип("Структура") Тогда
		Если Не Результат.Выполнено Тогда
			ОписаниеОшибки = Результат.ИнформацияОбОшибке.Описание;
		Иначе
			ОписаниеОшибки = "";
		КонецЕсли;
		УстановитьЭлемент(ЭтотОбъект, "ПроверкаПодписи", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	КонецЕсли;
	
	МодульСервисКриптографииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииКлиент");
	МодульСервисКриптографииКлиент.Зашифровать(Новый ОписаниеОповещения(
			"ПроверитьНаСторонеКлиентаПослеШифрованияВМоделиСервиса", ЭтотОбъект, Контекст,
			"ПроверитьНаСторонеКлиентаПослеОшибкиШифрования", ЭтотОбъект),
			Контекст.ДанныеСертификата, Контекст.ДанныеСертификата);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеОшибкиШифрования(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
	
	СтандартнаяОбработка = Ложь;
	ПроверитьНаСторонеКлиентаПослеШифрования(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеШифрования(ЗашифрованныеДанные, Контекст) Экспорт
	
	Если ТипЗнч(ЗашифрованныеДанные) = Тип("Строка") Тогда
		ОписаниеОшибки = ЗашифрованныеДанные;
	Иначе
		ОписаниеОшибки = "";
		ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеЗашифрованныеДанные(ЗашифрованныеДанные, ОписаниеОшибки);
	КонецЕсли;
	УстановитьЭлемент(ЭтотОбъект, "Шифрование", Контекст.ЭтоОперацияВСервисе, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	// Расшифровка.
	Если ПроверкиНаКлиенте.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		Контекст.МенеджерКриптографии.НачатьРасшифровку(Новый ОписаниеОповещения(
				"ПроверитьНаСторонеКлиентаПослеРасшифровки", ЭтотОбъект, Контекст,
				"ПроверитьНаСторонеКлиентаПослеОшибкиРасшифровки", ЭтотОбъект),
			ЗашифрованныеДанные);
	Иначе
		ПроверитьНаСторонеКлиентаПослеРасшифровки(Null, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
// 
// Параметры:
//  Результат - Структура:
//   * ИнформацияОбОшибке - Структура:
//      ** Описание - Строка
//  Контекст - Структура
//
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеШифрованияВМоделиСервиса(Результат, Контекст) Экспорт
	
	Если ТипЗнч(Результат) = Тип("Структура") Тогда
		Если Не Результат.Выполнено Тогда
			ОписаниеОшибки = Результат.ИнформацияОбОшибке.Описание;
		Иначе
			ОписаниеОшибки = "";
			ЗашифрованныеДанные = Результат.ЗашифрованныеДанные;
			ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеЗашифрованныеДанные(ЗашифрованныеДанные, ОписаниеОшибки);
		КонецЕсли;
	КонецЕсли;
	УстановитьЭлемент(ЭтотОбъект, "Шифрование", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	// Расшифровка.
	Если ПроверкиНаСервере.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		МодульСервисКриптографииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииКлиент");
		МодульСервисКриптографииКлиент.Расшифровать(Новый ОписаниеОповещения(
				"ПроверитьНаСторонеКлиентаПослеРасшифровкиВМоделиСервиса", ЭтотОбъект, Контекст,
				"ПроверитьНаСторонеКлиентаПослеОшибкиРасшифровки", ЭтотОбъект),
			Результат.ЗашифрованныеДанные);
	Иначе
		ПроверитьНаСторонеКлиентаПослеРасшифровкиВМоделиСервиса(Null, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеОшибкиРасшифровки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
	
	СтандартнаяОбработка = Ложь;
	ПроверитьНаСторонеКлиентаПослеРасшифровки(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеРасшифровки(РасшифрованныеДанные, Контекст) Экспорт
	
	Если РасшифрованныеДанные <> Null Тогда
		Если ТипЗнч(РасшифрованныеДанные) = Тип("Строка") Тогда
			ОписаниеОшибки = РасшифрованныеДанные;
		Иначе
			ОписаниеОшибки = "";
			ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеРасшифрованныеДанные(РасшифрованныеДанные, ОписаниеОшибки);
		КонецЕсли;
		УстановитьЭлемент(ЭтотОбъект, "Расшифровка", Контекст.ЭтоОперацияВСервисе, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	КонецЕсли;
	
	ПроверитьНаСторонеКлиентаДополнительныеПроверки(Контекст);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
// 
// Параметры:
//  Результат - Структура:
//   * ИнформацияОбОшибке - Структура:
//      ** Описание - Строка
//  Контекст - Структура
//
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеРасшифровкиВМоделиСервиса(Результат, Контекст) Экспорт
	
	Если ТипЗнч(Результат) = Тип("Структура") Тогда
		Если Не Результат.Выполнено Тогда
			ОписаниеОшибки = Результат.ИнформацияОбОшибке.Описание;
		Иначе
			ОписаниеОшибки = "";
			ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеРасшифрованныеДанные(Результат.РасшифрованныеДанные, ОписаниеОшибки);
		КонецЕсли;
		УстановитьЭлемент(ЭтотОбъект, "Расшифровка", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	КонецЕсли;
	
	ПроверитьНаСторонеКлиентаДополнительныеПроверки(Контекст);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаДополнительныеПроверки(Контекст)
	
	// Дополнительные проверки.
	Контекст.Вставить("Индекс", -1);
	
	ПроверитьНаСторонеКлиентаЦиклНачало(Контекст);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеДополнительнойПроверки(Неопределен, Контекст) Экспорт
	
	ПараметрыВыполнения = ПараметрыВыполненияКонтекста.Получить(Контекст);
	ПараметрыВыполненияКонтекста.Удалить(Контекст);
	
	УстановитьЭлемент(ЭтотОбъект, Контекст.ЭлементСписка.Имя, Ложь,
		ПараметрыВыполнения.ОписаниеОшибки,
		ПараметрыВыполнения.ЭтоПредупреждение <> Истина,
		ОбъединятьРезультаты);
	
	ПроверитьНаСторонеКлиентаЦиклНачало(Контекст);
	
КонецПроцедуры

#КонецОбласти

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаЦиклНачало(Контекст)
	
	Если ДополнительныеПроверки.Количество() <= Контекст.Индекс + 1 Тогда
		ВыполнитьОбработкуОповещения(Контекст.Оповещение);
		Возврат;
	КонецЕсли;
	Контекст.Индекс = Контекст.Индекс + 1;
	Контекст.Вставить("ЭлементСписка", ДополнительныеПроверки[Контекст.Индекс]);
	
	ПараметрыВыполнения = Новый Структура;
	ПараметрыВыполнения.Вставить("Сертификат",           Сертификат);
	ПараметрыВыполнения.Вставить("Проверка",             Контекст.ЭлементСписка.Имя);
	ПараметрыВыполнения.Вставить("МенеджерКриптографии", Контекст.МенеджерКриптографии);
	ПараметрыВыполнения.Вставить("ОписаниеОшибки",       "");
	ПараметрыВыполнения.Вставить("ЭтоПредупреждение",    Ложь);
	ПараметрыВыполнения.Вставить("ОжидатьПродолжения",   Ложь);
	ПараметрыВыполнения.Вставить("Пароль",               ?(ВводитьПароль, СвойстваПароля.Значение, Неопределено));
	ПараметрыВыполнения.Вставить("РезультатыПроверок",   ПроверкиНаКлиенте);
	ПараметрыВыполнения.Вставить("Оповещение",           Новый ОписаниеОповещения(
		"ПроверитьНаСторонеКлиентаПослеДополнительнойПроверки", ЭтотОбъект, Контекст));
	
	Если ТипЗнч(ПараметрыВыполненияКонтекста) <> Тип("Соответствие") Тогда
		ПараметрыВыполненияКонтекста = Новый Соответствие;
	КонецЕсли;
	ПараметрыВыполненияКонтекста.Вставить(Контекст, ПараметрыВыполнения);
	
	Попытка
		ЭлектроннаяПодписьКлиентПереопределяемый.ПриДополнительнойПроверкеСертификата(ПараметрыВыполнения);
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ПараметрыВыполнения.ОжидатьПродолжения = Ложь;
		ПараметрыВыполнения.ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
	КонецПопытки;
	
	Если ПараметрыВыполнения.ОжидатьПродолжения <> Истина Тогда
		ПроверитьНаСторонеКлиентаПослеДополнительнойПроверки(Неопределено, Контекст);
	КонецЕсли;
	
КонецПроцедуры

#Область ПроверкаНаКлиентеОблачнаяПодпись

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеАвторизацииВОблачнойПодписи(РезультатВызова, Контекст) Экспорт
	
	Если Не РезультатВызова.Выполнено Тогда
		ОписаниеОшибки = РезультатВызова.Ошибка;
	КонецЕсли;
	
	// Если не авторизовались, проверки прекращаются.
	Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
		Возврат;
	КонецЕсли;
	
	Контекст.Вставить("НастройкиПользователя", РезультатВызова.НастройкиПользователя);
	
	МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент");
	МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер");
	
	СтруктураПоиска = Новый Структура;
	СтруктураПоиска.Вставить("Отпечаток", МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(Контекст.СертификатКриптографии.Отпечаток));
	МодульСервисКриптографииDSSКлиент.НайтиСертификат(Новый ОписаниеОповещения(
		"ПроверитьНаСторонеКлиентаПослеПоискаСертификатаОблачнойПодписи", ЭтотОбъект, Контекст), СтруктураПоиска);
	
КонецПроцедуры
		
// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеПоискаСертификатаОблачнойПодписи(РезультатВызова, Контекст) Экспорт
	
	ОписаниеОшибки = "";
	Если Не ОперацияАктивна() Тогда
		ОписаниеОшибки = НСтр("ru = 'Форма проверки закрыта.'");
	ИначеЕсли Не РезультатВызова.Выполнено Тогда
		ОписаниеОшибки = РезультатВызова.Ошибка;
	ИначеЕсли Не ЗначениеЗаполнено(РезультатВызова.ДанныеСертификата) Тогда
		ОписаниеОшибки = НСтр("ru = 'Сертификат отсутствует в сервисе (возможно удален).'");
	КонецЕсли;
	
	Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
		ОписаниеОшибки = ОписаниеОшибки + Символы.ПС
			+ НСтр("ru = 'Проверка подписания, созданной подписи и расшифровки не могут быть выполнены.'");
	КонецЕсли;
	УстановитьЭлемент(ЭтотОбъект, "НаличиеСертификата", Истина, ОписаниеОшибки, , ОбъединятьРезультаты);
	
	Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
		ВыполнитьОбработкуОповещения(Контекст.Оповещение);
		Возврат;
	КонецЕсли;
	
	// Проверка данных сертификата.
	ОбработчикСледующий = Новый ОписаниеОповещения(
			"ПроверитьНаСторонеКлиентаПослеПроверкиСертификатаОблачнойПодписи", ЭтотОбъект, Контекст);
	
	МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент");
	МодульСервисКриптографииDSSКлиент.ПроверитьСертификат(ОбработчикСледующий, Контекст.НастройкиПользователя,
		РезультатВызова.ДанныеСертификата.Сертификат);
	
КонецПроцедуры
		
// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеПроверкиСертификатаОблачнойПодписи(Результат, Контекст) Экспорт
	
	Если Не ОперацияАктивна() Тогда
		ОписаниеОшибки = НСтр("ru = 'Форма проверки закрыта.'");
	ИначеЕсли Результат.Выполнено И Результат.Результат Тогда
		ОписаниеОшибки = "";
	Иначе
		ОписаниеОшибки = ЭлектроннаяПодписьСлужебныйКлиент.ТекстОшибкиОблачнаяПодпись("ПроверкаСертификата",
			Результат, Истина);
	КонецЕсли;
	
	УстановитьЭлемент(ЭтотОбъект, "ДанныеСертификата", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	Если Контекст.ПроверкаВСервисеВместоПроверкиНаСервере Тогда
		ВыполнитьОбработкуОповещения(Контекст.Оповещение);
		Возврат;
	КонецЕсли;
	
	// Наличие программы
	Если ЗначениеЗаполнено(Программа) Тогда
		ПроверитьНаСторонеКлиентаОблачнаяПодпись("ОблачнаяПодпись", Контекст);
	Иначе
		ОписаниеОшибки = НСтр("ru = 'Программа для использования закрытого ключа не указана в сертификате.'");
		ПроверитьНаСторонеКлиентаПослеСозданияМенеджераКриптографии(ОписаниеОшибки, Контекст);
	КонецЕсли;
	
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Асинх Процедура ПроверитьНаСторонеКлиентаОблачнаяПодпись(Результат, Контекст)
	
	Контекст.Вставить("МенеджерКриптографии", Неопределено);
	
	Если Не ОперацияАктивна() Тогда
		ОписаниеОшибки = НСтр("ru = 'Форма проверки закрыта.'");
	ИначеЕсли ТипЗнч(Результат) = Тип("Строка") И Результат = "ОблачнаяПодпись" Тогда
		Контекст.МенеджерКриптографии = Результат;
		ОписаниеОшибки = "";
	Иначе
		ОписаниеОшибки = Результат + Символы.ПС + Символы.ПС
			+ НСтр("ru = 'Проверка подписания, созданной подписи, шифрования и
			             |расшифровки не могут быть выполнены.'");
	КонецЕсли;
	УстановитьЭлемент(ЭтотОбъект, "НаличиеПрограммы", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	Если Контекст.МенеджерКриптографии = Неопределено Тогда
		ВыполнитьОбработкуОповещения(Контекст.Оповещение);
		Возврат;
	КонецЕсли;
	
	ОписаниеОшибки = Ждать ДополнительнаяПроверкаНаВозможностьПодписания(Контекст.СертификатКриптографии, Истина);
	
	// Подписание.
	Если ПроверкиНаСервере.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда

		МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер");
		МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент");
		
		ОбработчикСледующий = Новый ОписаниеОповещения(
				"ПроверитьНаСторонеКлиентаПослеПодписанияОблачнаяПодпись", ЭтотОбъект, Контекст,
				"ПроверитьНаСторонеКлиентаПослеОшибкиПодписания", ЭтотОбъект);
		
		СтруктураПоиска = Новый Структура;
		СтруктураПоиска.Вставить("Отпечаток", МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(Контекст.СертификатКриптографии.Отпечаток));
		
		ЗначениеПинКода = ?(ЗначениеЗаполнено(СвойстваПароля.Значение), СвойстваПароля.Значение, Неопределено);
		ПараметрыОперации = Новый Структура;
		ПараметрыОперации.Вставить("ПинКод", МодульСервисКриптографииDSSКлиент.ПодготовитьОбъектПароля(ЗначениеПинКода));
		
		МодульСервисКриптографииDSSКлиент.Подписать(
				ОбработчикСледующий,
				Контекст.НастройкиПользователя,
				Контекст.ДанныеСертификата,
				,
				СтруктураПоиска,
				ПараметрыОперации);
				
	Иначе
		ПроверитьНаСторонеКлиентаПослеПодписанияОблачнаяПодпись(Неопределено, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеПодписанияОблачнаяПодпись(РезультатВызова, Контекст) Экспорт
	
	ОписаниеОшибки = Неопределено;
	
	Если Не ОперацияАктивна() Тогда
		ОписаниеОшибки = НСтр("ru = 'Форма проверки закрыта.'");
	ИначеЕсли РезультатВызова <> Неопределено Тогда
		Если Не РезультатВызова.Выполнено Тогда
			ОписаниеОшибки = РезультатВызова.Ошибка;
		Иначе
			ДанныеПодписи = РезультатВызова.Результат;
			ОписаниеОшибки = "";
			ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДанныеПодписи, ОписаниеОшибки);
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
			ПарольПринят = Истина;
		КонецЕсли;
	КонецЕсли;
	
	УстановитьЭлемент(ЭтотОбъект, "Подписание", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	// Проверка подписи.
	Если РезультатВызова <> Неопределено И ПроверкиНаСервере.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		ОбработчикСледующий = Новый ОписаниеОповещения(
					"ПроверитьНаСторонеКлиентаПослеПроверкиПодписиОблачнаяПодпись", ЭтотОбъект, Контекст,
					"ПроверитьНаСторонеКлиентаПослеОшибкиПроверкиПодписи", ЭтотОбъект);
		
		МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент");
		МодульСервисКриптографииDSSКлиент.ПроверитьПодпись(ОбработчикСледующий, 
						Контекст.НастройкиПользователя, 
						ДанныеПодписи,
						Контекст.ДанныеСертификата,
						"CMS");
	Иначе
		ПроверитьНаСторонеКлиентаПослеПроверкиПодписиОблачнаяПодпись(Неопределено, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеПроверкиПодписиОблачнаяПодпись(РезультатВызова, Контекст) Экспорт
	
	ОписаниеОшибки = Неопределено;
	
	Если Не ОперацияАктивна() Тогда
		ОписаниеОшибки = НСтр("ru = 'Форма проверки закрыта.'");
	ИначеЕсли РезультатВызова <> Неопределено Тогда
		Если Не РезультатВызова.Выполнено Тогда
			ОписаниеОшибки = ЭлектроннаяПодписьСлужебныйКлиент.ТекстОшибкиОблачнаяПодпись(
				"ПроверкаПодписи", РезультатВызова, Истина);
		Иначе
			ОписаниеОшибки = "";
		КонецЕсли;
		УстановитьЭлемент(ЭтотОбъект, "ПроверкаПодписи", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		ОбработчикСледующий = Новый ОписаниеОповещения(
				"ПроверитьНаСторонеКлиентаПослеШифрованияОблачнаяПодпись", ЭтотОбъект, Контекст,
				"ПроверитьНаСторонеКлиентаПослеОшибкиШифрования", ЭтотОбъект);
		
		МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент");
		МодульСервисКриптографииDSSКлиент.Зашифровать(ОбработчикСледующий,
				Контекст.НастройкиПользователя,
				Контекст.ДанныеСертификата,
				Контекст.ДанныеСертификата);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеШифрованияОблачнаяПодпись(РезультатВызова, Контекст) Экспорт
	
	ОписаниеОшибки = Неопределено;
	Если Не ОперацияАктивна() Тогда
		ОписаниеОшибки = НСтр("ru = 'Форма проверки закрыта.'");
	ИначеЕсли РезультатВызова <> Неопределено Тогда
		Если Не РезультатВызова.Выполнено Тогда
			ОписаниеОшибки = РезультатВызова.Ошибка;
		Иначе
			ОписаниеОшибки = "";
		КонецЕсли;
	КонецЕсли;
	УстановитьЭлемент(ЭтотОбъект, "Шифрование", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	// Расшифровка.
	Если ПроверкиНаСервере.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		ОбработчикСледующий = Новый ОписаниеОповещения(
				"ПроверитьНаСторонеКлиентаПослеРасшифровкиОблачнаяПодпись", ЭтотОбъект, Контекст,
				"ПроверитьНаСторонеКлиентаПослеОшибкиРасшифровки", ЭтотОбъект);
		
		МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент");
		МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер");
		
		СтруктураПоиска = Новый Структура;
		СтруктураПоиска.Вставить("Отпечаток", МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(Контекст.СертификатКриптографии.Отпечаток));
		
		ЗначениеПинКода = ?(ЗначениеЗаполнено(СвойстваПароля.Значение), СвойстваПароля.Значение, Неопределено);
		ПараметрыОперации = Новый Структура;
		ПараметрыОперации.Вставить("ПинКод", МодульСервисКриптографииDSSКлиент.ПодготовитьОбъектПароля(ЗначениеПинКода));
		
		МодульСервисКриптографииDSSКлиент.Расшифровать(ОбработчикСледующий, Контекст.НастройкиПользователя, РезультатВызова.Результат, , СтруктураПоиска, ПараметрыОперации);
	Иначе
		ПроверитьНаСторонеКлиентаПослеРасшифровкиОблачнаяПодпись(Неопределено, Контекст);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеРасшифровкиОблачнаяПодпись(РезультатВызова, Контекст) Экспорт
	
	ОписаниеОшибки = Неопределено;
	Если Не ОперацияАктивна() Тогда
		ОписаниеОшибки = НСтр("ru = 'Форма проверки закрыта.'");
	ИначеЕсли РезультатВызова <> Неопределено Тогда
		Если Не РезультатВызова.Выполнено Тогда
			ОписаниеОшибки = РезультатВызова.Ошибка;
		Иначе
			ОписаниеОшибки = "";
			ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеРасшифрованныеДанные(РезультатВызова.Результат, ОписаниеОшибки);
		КонецЕсли;
		УстановитьЭлемент(ЭтотОбъект, "Расшифровка", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	КонецЕсли;
	
	ПроверитьНаСторонеКлиентаДополнительныеПроверки(Контекст);
	
КонецПроцедуры

&НаКлиенте
Функция ОперацияАктивна()
	
	Результат = Открыта();
	Возврат Результат;
	
КонецФункции	

#КонецОбласти

#Область ПроверкаНаСервере

&НаСервере
Процедура ПроверитьНаСторонеСервера(Знач ЗначениеПароля)
	
	ПроверкаВыполнена = Истина;
	
	ИмяСервера = ИмяКомпьютера();
	
	ДанныеСертификата = ПолучитьИзВременногоХранилища(АдресСертификата);
	АлгоритмПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписиСертификата(ДанныеСертификата);
	
	Попытка
		СертификатКриптографии = Новый СертификатКриптографии(ДанныеСертификата);
	Исключение
		УстановитьЭлемент(ЭтотОбъект, ИмяПервойПроверки, Истина,
			ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), Истина, ОбъединятьРезультаты);
		Возврат;
	КонецПопытки;
	
	// Законный сертификат.
	ПроверитьЗаконныйСертификатНаСервере(СертификатКриптографии);
	
	// Наличие сертификата в личном списке.
	Результат = Новый Структура;
	ЭлектроннаяПодписьСлужебный.ПолучитьСертификатПоОтпечатку(
		Base64Строка(СертификатКриптографии.Отпечаток), Истина, Ложь, , Результат);
	
	ОписаниеОшибки = "";
	Если ЗначениеЗаполнено(Результат) Тогда
		ОписаниеОшибки = Результат.ОписаниеОшибки + Символы.ПС + Символы.ПС
			+ НСтр("ru = 'Проверка подписания, созданной подписи и расшифровки не могут быть выполнены.'");
	КонецЕсли;
	УстановитьЭлемент(ЭтотОбъект, "НаличиеСертификата", Истина, ОписаниеОшибки, , ОбъединятьРезультаты);
	
	// Проверка данных сертификата.
	ПараметрыСоздания = ЭлектроннаяПодписьСлужебный.ПараметрыСозданияМенеджераКриптографии();
	ПараметрыСоздания.АлгоритмПодписи = АлгоритмПодписи;
	
	МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии(
		"ПроверкаСертификата", ПараметрыСоздания);
	
	ОписаниеОшибки = ПараметрыСоздания.ОписаниеОшибки;
	Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		ДополнительныеПараметрыПроверкиСертификата = 
			ЭлектроннаяПодписьСлужебный.ДополнительныеПараметрыПроверкиСертификата();
		ДополнительныеПараметрыПроверкиСертификата.ВыполнятьПроверкуУдостоверяющегоЦентра = Ложь;
		ЭлектроннаяПодписьСлужебный.ПроверитьСертификат(МенеджерКриптографии, СертификатКриптографии, ОписаниеОшибки,,ДополнительныеПараметрыПроверкиСертификата);
	КонецЕсли;
	
	УстановитьЭлемент(ЭтотОбъект, "ДанныеСертификата", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	// Наличие программы.
	Если ЗначениеЗаполнено(Программа) Тогда
		ПараметрыСоздания = ЭлектроннаяПодписьСлужебный.ПараметрыСозданияМенеджераКриптографии();
		ПараметрыСоздания.Программа = Программа;
		
		МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("ПроверкаСертификата", ПараметрыСоздания);
		ОписаниеОшибки = ПараметрыСоздания.ОписаниеОшибки;
	Иначе
		
		ПрограммаАвтоНаСервереРезультат = ЭлектроннаяПодписьСлужебный.ПрограммаПоСертификату(АдресСертификата);
		ПрограммаАвтоНаСервере = ПрограммаАвтоНаСервереРезультат.Программа;
		
		Если ПрограммаАвтоНаСервереРезультат.Программа = Неопределено Тогда
			ОписаниеОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиНеУдалосьОпределитьПрограмму(
				ПрограммаАвтоНаСервереРезультат.Ошибка);
			МенеджерКриптографии = Неопределено;
		Иначе
			ПараметрыСоздания = ЭлектроннаяПодписьСлужебный.ПараметрыСозданияМенеджераКриптографии();
			ПараметрыСоздания.Программа = ПрограммаАвтоНаСервере;
			МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("ПроверкаСертификата", ПараметрыСоздания);
			ОписаниеОшибки = ПараметрыСоздания.ОписаниеОшибки;
		КонецЕсли;
		
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		
		ОписаниеОшибки = ОписаниеОшибки + Символы.ПС + Символы.ПС
			+ НСтр("ru = 'Проверка подписания, созданной подписи, шифрования и
			|расшифровки не могут быть выполнены.'");
		
	КонецЕсли;
	УстановитьЭлемент(ЭтотОбъект, "НаличиеПрограммы", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	Если МенеджерКриптографии = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = ЗначениеПароля;
	
	ОписаниеОшибки = "";
	
	Если Отозван Тогда
		ОписаниеОшибки = ЭлектроннаяПодписьСлужебный.ОшибкаСертификатПомеченКакОтозванный();
		УстановитьЭлемент(ЭтотОбъект, "Подписание", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	Иначе
		РезультатПроверкиУЦ = ЭлектроннаяПодписьСлужебный.РезультатПроверкиУдостоверяющегоЦентраСертификата(
			СертификатКриптографии);
		Если Не РезультатПроверкиУЦ.Действует Тогда
			ПодписаниеРазрешено = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
				Сертификат, "РазрешитьПодписание", Неопределено);
			Если ПодписаниеРазрешено = Неопределено Или Не ПодписаниеРазрешено Тогда
				ОписаниеОшибки = РезультатПроверкиУЦ.Предупреждение.ТекстОшибки;
				УстановитьЭлемент(ЭтотОбъект, "Подписание", Истина, РезультатПроверкиУЦ.Предупреждение, Истина,
					ОбъединятьРезультаты);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если ПроверкиНаСервере.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		ДанныеПодписи = ПроверитьПодписаниеНаСервере(МенеджерКриптографии, ДанныеСертификата, СертификатКриптографии, ОписаниеОшибки);
	КонецЕсли;
	
	Если ПроверкиНаСервере.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		ПроверитьПодписьНаСервере(МенеджерКриптографии, ДанныеСертификата, ДанныеПодписи);
	КонецЕсли;
	
	ОписаниеОшибки = "";
	ЗашифрованныеДанные = ПроверитьШифрованиеНаСервере(МенеджерКриптографии, ДанныеСертификата, СертификатКриптографии, ОписаниеОшибки); 
	
	Если ПроверкиНаСервере.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		ПроверитьРасшифрованиеНаСервере(МенеджерКриптографии, ЗашифрованныеДанные);
	КонецЕсли;
	
	ПроверитьНаСторонеСервераДополнительныеПроверки(ЗначениеПароля, МенеджерКриптографии);
	
КонецПроцедуры

&НаСервере
Процедура ПроверитьЗаконныйСертификатНаСервере(СертификатКриптографии)
	
	ОписаниеОшибки = "";
	Если Элементы.ГруппаЗаконныйСертификат.Видимость
		И Не СертификатКриптографии.Субъект.Свойство("SN") Тогда
		
		ОписаниеОшибки = НСтр("ru = 'В описании субъекта сертификата не найдено поле ""SN"".'");
	КонецЕсли;
	УстановитьЭлемент(ЭтотОбъект, "ЗаконныйСертификат", Истина, ОписаниеОшибки, , ОбъединятьРезультаты);

КонецПроцедуры

&НаСервере
Функция ПроверитьПодписаниеНаСервере(МенеджерКриптографии, ДанныеСертификата, СертификатКриптографии, ОписаниеОшибки)
	
	Попытка
		ДанныеПодписи = МенеджерКриптографии.Подписать(ДанныеСертификата, СертификатКриптографии);
		ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДанныеПодписи, ОписаниеОшибки);
	Исключение
		ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
	КонецПопытки;
	
	ПарольПринят = Не ЗначениеЗаполнено(ОписаниеОшибки);
	УстановитьЭлемент(ЭтотОбъект, "Подписание", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	Возврат ДанныеПодписи;
	
КонецФункции

&НаСервере
Процедура ПроверитьПодписьНаСервере(МенеджерКриптографии, ДанныеСертификата, ДанныеПодписи)
	
	ОписаниеОшибки = "";
	Попытка
		МенеджерКриптографии.ПроверитьПодпись(ДанныеСертификата, ДанныеПодписи);
	Исключение
		ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
	КонецПопытки;
	УстановитьЭлемент(ЭтотОбъект, "ПроверкаПодписи", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
КонецПроцедуры

&НаСервере
Функция ПроверитьШифрованиеНаСервере(МенеджерКриптографии, ДанныеСертификата, СертификатКриптографии, ОписаниеОшибки)
	
	Попытка
		ЗашифрованныеДанные = МенеджерКриптографии.Зашифровать(ДанныеСертификата, СертификатКриптографии);
		ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеЗашифрованныеДанные(ЗашифрованныеДанные, ОписаниеОшибки);
	Исключение
		ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
	КонецПопытки;
	УстановитьЭлемент(ЭтотОбъект, "Шифрование", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	Возврат ЗашифрованныеДанные;
	
КонецФункции

&НаСервере
Процедура ПроверитьРасшифрованиеНаСервере(МенеджерКриптографии, ЗашифрованныеДанные)
	
	ОписаниеОшибки = "";
	Попытка
		РасшифрованныеДанные = МенеджерКриптографии.Расшифровать(ЗашифрованныеДанные);
		ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеРасшифрованныеДанные(РасшифрованныеДанные, ОписаниеОшибки);
	Исключение
		ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
	КонецПопытки;
	УстановитьЭлемент(ЭтотОбъект, "Расшифровка", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
КонецПроцедуры

&НаСервере
Процедура ПроверитьНаСторонеСервераДополнительныеПроверки(ЗначениеПароля, МенеджерКриптографии = Неопределено)
	
	ИмяСервера = ИмяКомпьютера();
	
	// Дополнительные проверки.
	Для Каждого ЭлементСписка Из ДополнительныеПроверки Цикл
		
		ОписаниеОшибки = "";
		ЭтоПредупреждение = Ложь;
		Попытка
			ПараметрыВыполнения = Новый Структура;
			ПараметрыВыполнения.Вставить("Сертификат",           Сертификат);
			ПараметрыВыполнения.Вставить("Проверка",             ЭлементСписка.Имя);
			ПараметрыВыполнения.Вставить("МенеджерКриптографии", МенеджерКриптографии);
			ПараметрыВыполнения.Вставить("ОписаниеОшибки",       ОписаниеОшибки);
			ПараметрыВыполнения.Вставить("ЭтоПредупреждение",    ЭтоПредупреждение);
			ПараметрыВыполнения.Вставить("Пароль",               ?(ВводитьПароль, ЗначениеПароля, Неопределено));
			ПараметрыВыполнения.Вставить("РезультатыПроверок",   ПроверкиНаСервере);
			
			ЭлектроннаяПодписьПереопределяемый.ПриДополнительнойПроверкеСертификата(ПараметрыВыполнения);
			
			ОписаниеОшибки    = ПараметрыВыполнения.ОписаниеОшибки;
			ЭтоПредупреждение = ПараметрыВыполнения.ЭтоПредупреждение;
		Исключение
			ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		КонецПопытки;
		
		УстановитьЭлемент(ЭтотОбъект, ЭлементСписка.Имя, Истина,
			ОписаниеОшибки, ЭтоПредупреждение <> Истина, ОбъединятьРезультаты);
		
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#Область УправлениеЭлементамиФормы

&НаСервере
Процедура ДобавитьКартинку(ИмяЭлемента, Родитель, Картинка = Неопределено)
	
	Декорация = Элементы.Добавить(ИмяЭлемента, Тип("ДекорацияФормы"), Родитель);
	Декорация.Вид = ВидДекорацииФормы.Картинка;
	Декорация.Ширина = 2;
	Декорация.Высота = 1;
	Декорация.Картинка = ?(Картинка = Неопределено, Новый Картинка, Картинка);
	Декорация.РазмерКартинки = РазмерКартинки.АвтоРазмер;
	
КонецПроцедуры

&НаСервере
Процедура ДобавитьЭлементыОписанияОшибок(ИмяПроверки, Родитель, НаСервере = Ложь)
	
	ГруппаОшибкаКлиент = ГруппаФормыБезОтображения(
			ИмяПроверки + ?(НаСервере, "ОшибкаСервер", "ОшибкаКлиент"), Родитель,
			ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда);
	ГруппаОшибкаКлиент.Видимость = Ложь;
		
	ДобавитьКартинку(ИмяПроверки + ?(НаСервере, "ОшибкаСерверКартинка", "ОшибкаКлиентКартинка"),
		ГруппаОшибкаКлиент, БиблиотекаКартинок[?(НаСервере, "КомпьютерСервер", "КомпьютерКлиент")]);
	Надпись = Элементы.Добавить(ИмяПроверки + ?(НаСервере, "ОшибкаСерверНадпись", "ОшибкаКлиентНадпись"),
		Тип("ДекорацияФормы"), ГруппаОшибкаКлиент);
	Надпись.ЦветТекста = ЦветаСтиля.ПоясняющийТекст;
	Надпись = Элементы.Добавить(ИмяПроверки + ?(НаСервере, "РешениеСерверНадпись", "РешениеКлиентНадпись"),
		Тип("ДекорацияФормы"), Родитель);
	Надпись.ЦветТекста = ЦветаСтиля.ПоясняющийТекст;
	Надпись.УстановитьДействие("ОбработкаНавигационнойСсылки", "Подключаемый_НадписьОбработкаНавигационнойСсылки");
	
КонецПроцедуры

&НаСервере
Функция ГруппаФормыБезОтображения(ИмяГруппы, Родитель, Группировка = Неопределено)
	
	Группа = Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"), Родитель);
	Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
	Группа.Отображение = ОтображениеОбычнойГруппы.Нет;
	Группа.ОтображатьЗаголовок = Ложь;
	
	Группа.Группировка = ?(Группировка = Неопределено,
		ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда, Группировка);
		
	Возврат Группа;
	
КонецФункции

&НаСервере
Процедура ОбновитьВидимостьНаСервере()
	
	ОперацииНаСервере = (ЭлектроннаяПодпись.ПроверятьЭлектронныеПодписиНаСервере()
		Или ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере());
		
	ПроверятьЭлектронныеПодписиНаСервере = Константы.ПроверятьЭлектронныеПодписиНаСервере.Получить();
		
	ПроверкаВСервисе = (ЭтоВстроенныйКриптопровайдер Или ЭтоУчетнаяЗаписьСервиса 
		Или ПроверятьЭлектронныеПодписиНаСервере И (ЕстьУчетнаяЗаписьСервиса Или ЕстьВстроенныйКриптопровайдер));
		
	ВидимостьПроверкиНаСервере = ОперацииНаСервере Или ПроверкаВСервисе;
	ВидимостьКолонкиНаСервере = ВидимостьПроверкиНаСервере И ОбъединятьРезультаты <> "ОбъединятьПоИ" И ОбъединятьРезультаты <> "ОбъединятьПоИли";
	
	Элементы.ГруппаШапка.Видимость = ВидимостьПроверкиНаСервере;
	
	Для Каждого Проверка Из СтандартныеПроверки() Цикл
		Элементы[Проверка + "ОшибкаКлиентКартинка"].Видимость = ВидимостьПроверкиНаСервере;
		Элементы[Проверка + "НаСервереКартинка"].Видимость = ВидимостьКолонкиНаСервере;
	КонецЦикла;
	
	Для каждого Проверка Из ДополнительныеПроверки Цикл
		Элементы[Проверка.Имя + "ОшибкаКлиентКартинка"].Видимость = ВидимостьПроверкиНаСервере;
		Элементы[Проверка.Имя + "НаСервереКартинка"].Видимость = ВидимостьКолонкиНаСервере;
	КонецЦикла;
	
	Элементы.ПроверкиНаСервереКартинка.Видимость = ВидимостьКолонкиНаСервере;
	Элементы.ПроверкиНаКлиентеКартинка.Видимость = ВидимостьКолонкиНаСервере;
	
КонецПроцедуры

&НаСервере
Процедура ВывестиРезультатПроверки(Проверка, НаСервере = Ложь)
	
	РезультатыПроверок = ЭтотОбъект[?(НаСервере, "ПроверкиНаСервере", "ПроверкиНаКлиенте")];
	ДополнительныеДанныеПроверок = ЭтотОбъект[?(НаСервере, "ДополнительныеДанныеПроверокНаСервере", "ДополнительныеДанныеПроверокНаКлиенте")];
	
	Если РезультатыПроверок <> Неопределено Тогда
		
		РезультатПроверки = РезультатыПроверок[Проверка];
		Если РезультатПроверки = Неопределено Тогда
			УстановитьЭлемент(ЭтотОбъект, Проверка, НаСервере, , , ОбъединятьРезультаты);
		Иначе
			
			ОшибкиПриПроверке = ?(РезультатыПроверок.Свойство(Проверка + "Ошибка"),
				РезультатыПроверок[Проверка + "Ошибка"], "");
				
			Если ДополнительныеДанныеПроверок.Свойство(Проверка) Тогда
				Структура = ДополнительныеДанныеПроверок[Проверка];
				Структура.Вставить("ТекстОшибки", ОшибкиПриПроверке);
				УстановитьЭлемент(ЭтотОбъект, Проверка, НаСервере,
					Структура, Не РезультатПроверки, ОбъединятьРезультаты);
			Иначе
				УстановитьЭлемент(ЭтотОбъект, Проверка, НаСервере,
					ОшибкиПриПроверке, Не РезультатПроверки, ОбъединятьРезультаты);
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьЭлемент(Форма, НачалоЭлемента, НаСервере,
	ОписаниеОшибки = Неопределено, ЭтоОшибка = Ложь, ОбъединятьРезультаты = "НеОбъединять")
	
	ЭлементНадпись = Форма.Элементы[НачалоЭлемента + "Надпись"]; // ДекорацияФормы, РасширениеДекорацииФормыДляНадписи
	
	Если ОбъединятьРезультаты = "ОбъединятьПоИ"
		Или ОбъединятьРезультаты = "ОбъединятьПоИли" Тогда
		
		ЭлементКартинка = Форма.Элементы[НачалоЭлемента + "НаКлиентеКартинка"]; // ДекорацияФормы
		
	Иначе
		ЭлементКартинка = Форма.Элементы[НачалоЭлемента
			+ ?(НаСервере, "НаСервереКартинка", "НаКлиентеКартинка")]; // ДекорацияФормы
	КонецЕсли;
	
	Проверки = Форма[?(НаСервере, "ПроверкиНаСервере", "ПроверкиНаКлиенте")];
	ПроверкиВторогоКонтекста = Форма[?(НаСервере, "ПроверкиНаКлиенте", "ПроверкиНаСервере")];
	
	ЗначениеПроверкиВторогоКонтекста = Неопределено;
	Если ТипЗнч(ПроверкиВторогоКонтекста) = Тип("Структура")
		И ПроверкиВторогоКонтекста.Свойство(НачалоЭлемента) Тогда
		
		ЗначениеПроверкиВторогоКонтекста = ПроверкиВторогоКонтекста[НачалоЭлемента];
	КонецЕсли;
	
	ПредупреждениеПослеПроверкиУЦ = Неопределено;
	Если ТипЗнч(ОписаниеОшибки) = Тип("Структура") Тогда
		ПредупреждениеПослеПроверкиУЦ = ОписаниеОшибки;
		ОписаниеОшибки = ПредупреждениеПослеПроверкиУЦ.ТекстОшибки;
		ДополнительныеДанныеПроверок = Форма[?(НаСервере, "ДополнительныеДанныеПроверокНаСервере", "ДополнительныеДанныеПроверокНаКлиенте")];
		ДополнительныеДанныеПроверок.Вставить(НачалоЭлемента,
			Новый Структура("Причина, Решение", ПредупреждениеПослеПроверкиУЦ.Причина, ПредупреждениеПослеПроверкиУЦ.Решение));
		Форма[?(НаСервере, "ДополнительныеДанныеПроверокНаСервере", "ДополнительныеДанныеПроверокНаКлиенте")] = ДополнительныеДанныеПроверок;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		
		ЗначениеПроверки = Ложь;
		РезультатПроверки = ЗначениеПроверки;
		Если ОбъединятьРезультаты = "ОбъединятьПоИли"
			И ЗначениеПроверкиВторогоКонтекста <> Неопределено Тогда
			
			РезультатПроверки = Ложь Или ЗначениеПроверкиВторогоКонтекста;
		КонецЕсли;
		
		Если Не РезультатПроверки Тогда
			ГруппаОшибка = Форма.Элементы[НачалоЭлемента + ?(НаСервере, "ОшибкаСервер", "ОшибкаКлиент")];
			ГруппаОшибка.Видимость = Истина;
			ЭлементКартинка.Картинка = ?(ЭтоОшибка,
				БиблиотекаКартинок.ПроверкаСертификатаОшибка,
				БиблиотекаКартинок.ПроверкаСертификатаПредупреждение);
			
			ЭлементКартинка.Подсказка = ОписаниеОшибки;
			ЭлементНадпись.Гиперссылка = Истина;
			
			ЭлементНадписьОшибка = Форма.Элементы[НачалоЭлемента + ?(НаСервере, "ОшибкаСервер", "ОшибкаКлиент") + "Надпись"]; // ДекорацияФормы, РасширениеДекорацииФормыДляНадписи
			ЭлементНадписьОшибка.Заголовок = ОписаниеОшибки;
		
			Если ПредупреждениеПослеПроверкиУЦ = Неопределено Тогда
				ОписаниеИзвестнойОшибки = ОшибкаПоКлассификатору(ОписаниеОшибки, НаСервере);
				ЭтоИзвестнаяОшибка = ОписаниеИзвестнойОшибки <> Неопределено;
				
				ИмяНадписиРешение = НачалоЭлемента + ?(НаСервере, "РешениеСерверНадпись", "РешениеКлиентНадпись");
				Форма.Элементы[ИмяНадписиРешение].Видимость = ЭтоИзвестнаяОшибка;
				Если ЭтоИзвестнаяОшибка Тогда
					Форма.Элементы[ИмяНадписиРешение].Заголовок = ОписаниеИзвестнойОшибки.Решение;
				КонецЕсли;
			Иначе
				ИмяНадписиРешение = НачалоЭлемента + ?(НаСервере, "РешениеСерверНадпись", "РешениеКлиентНадпись");
				Форма.Элементы[ИмяНадписиРешение].Видимость = Истина;
				Форма.Элементы[ИмяНадписиРешение].Заголовок = ПредупреждениеПослеПроверкиУЦ.Решение;
			КонецЕсли;
		КонецЕсли;
		
	Иначе
		
		ГруппаОшибка = Форма.Элементы[НачалоЭлемента + ?(НаСервере, "ОшибкаСервер", "ОшибкаКлиент")];
		ЭлементРешение = Форма.Элементы[НачалоЭлемента
			+ ?(НаСервере, "РешениеСерверНадпись", "РешениеКлиентНадпись")];
		ЗначениеПроверки = ?(ОписаниеОшибки = Неопределено, Неопределено, Истина);
		
		Если (ОбъединятьРезультаты = "ОбъединятьПоИ"
			Или ОбъединятьРезультаты = "ОбъединятьПоИли") Тогда
			
			Если ЗначениеПроверки = Неопределено
				И ЗначениеПроверкиВторогоКонтекста = Неопределено Тогда
				
				ГруппаОшибка.Видимость = Ложь;
				ЭлементРешение.Видимость = Ложь;
				ЭлементКартинка.Картинка = БиблиотекаКартинок.ПроверкаСертификатаНеВыполнялась;
				ЭлементКартинка.Подсказка = НСтр("ru = 'Проверка не выполнялась.'");
				ЭлементНадпись.Гиперссылка = Ложь;
				ЭлементНадпись.Заголовок = ЗаголовокЭлемента(
					Форма.ДополнительныеПроверки, ЭлементНадпись.Имя);
				
			ИначеЕсли ЗначениеПроверки = Неопределено
				И ЗначениеПроверкиВторогоКонтекста <> Неопределено Тогда
				
				Проверки.Вставить(НачалоЭлемента, ЗначениеПроверки);
				Проверки.Вставить(НачалоЭлемента + "Ошибка",
					?(ОписаниеОшибки = Неопределено, "", ОписаниеОшибки));
				Возврат;
				
			ИначеЕсли ЗначениеПроверки <> Неопределено
				И ЗначениеПроверкиВторогоКонтекста = Неопределено Тогда
				
				ГруппаОшибка.Видимость = Ложь;
				ЭлементРешение.Видимость = Ложь;
				ЭлементКартинка.Картинка = БиблиотекаКартинок.ПроверкаСертификатаУспех;
				ЭлементКартинка.Подсказка = НСтр("ru = 'Проверка выполнена успешно.'");
				ЭлементНадпись.Гиперссылка = Ложь;
				ЭлементНадпись.Заголовок = ЗаголовокЭлемента(
					Форма.ДополнительныеПроверки, ЭлементНадпись.Имя);
			Иначе
				РезультатПроверки = ?(ОбъединятьРезультаты = "ОбъединятьПоИ",
					ЗначениеПроверки И ЗначениеПроверкиВторогоКонтекста,
					ЗначениеПроверки Или ЗначениеПроверкиВторогоКонтекста);
					
				Если РезультатПроверки Тогда
					ГруппаОшибка.Видимость = Ложь;
					ЭлементРешение.Видимость = Ложь;
					ЭлементКартинка.Картинка = БиблиотекаКартинок.ПроверкаСертификатаУспех;
					ЭлементКартинка.Подсказка = НСтр("ru = 'Проверка выполнена успешно.'");
					ЭлементНадпись.Гиперссылка = Ложь;
					ЭлементНадпись.Заголовок = ЗаголовокЭлемента(
						Форма.ДополнительныеПроверки, ЭлементНадпись.Имя);
				КонецЕсли;
			КонецЕсли;
		Иначе
			ЭлементКартинка.Картинка = ?(ОписаниеОшибки = Неопределено,
				БиблиотекаКартинок.ПроверкаСертификатаНеВыполнялась,
				БиблиотекаКартинок.ПроверкаСертификатаУспех);
			ЭлементКартинка.Подсказка = ?(ОписаниеОшибки = Неопределено,
				НСтр("ru = 'Проверка не выполнялась.'"),
				НСтр("ru = 'Проверка выполнена успешно.'"));
			
			Если ПроверкиВторогоКонтекста = Неопределено
				Или Не ПроверкиВторогоКонтекста.Свойство(НачалоЭлемента + "Ошибка")
				Или ПустаяСтрока(ПроверкиВторогоКонтекста[НачалоЭлемента + "Ошибка"]) Тогда
				
				ГруппаОшибка.Видимость = Ложь;
				ЭлементРешение.Видимость = Ложь;
				ЭлементНадпись.Гиперссылка = Ложь;
				ЭлементНадпись.Заголовок = ЗаголовокЭлемента(
					Форма.ДополнительныеПроверки, ЭлементНадпись.Имя);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Проверки.Вставить(НачалоЭлемента, ЗначениеПроверки);
	Проверки.Вставить(НачалоЭлемента + "Ошибка",
		?(ОписаниеОшибки = Неопределено, "", ОписаниеОшибки));
		
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ЗаголовокЭлемента(ДополнительныеПроверки, ИмяЭлемента)
	
	ЗаголовокЭлемента = СтандартныйЗаголовокЭлемента(ИмяЭлемента);
	Если Не ПустаяСтрока(ЗаголовокЭлемента) Тогда
		Возврат ЗаголовокЭлемента;
	КонецЕсли;
		
	Для Каждого Проверка Из ДополнительныеПроверки Цикл
		
		Если Проверка.Имя + "Надпись" = ИмяЭлемента Тогда
			Возврат Проверка.Представление;
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат "";
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция СтандартныйЗаголовокЭлемента(ИмяЭлемента)
	
	Если ИмяЭлемента = "ЗаконныйСертификатНадпись" Тогда
		Возврат НСтр("ru = 'Соответствие законодательству Российской Федерации'");
		
	ИначеЕсли ИмяЭлемента = "НаличиеСертификатаНадпись" Тогда
		Возврат НСтр("ru = 'Наличие сертификата в личном списке'");
		
	ИначеЕсли ИмяЭлемента = "ДанныеСертификатаНадпись" Тогда
		Возврат НСтр("ru = 'Корректность данных сертификата'");
		
	ИначеЕсли ИмяЭлемента = "НаличиеПрограммыНадпись" Тогда
		Возврат НСтр("ru = 'Наличие программы для подписания и расшифровки'");
		
	ИначеЕсли ИмяЭлемента = "ПодписаниеНадпись" Тогда
		Возврат НСтр("ru = 'Подписание данных'");
		
	ИначеЕсли ИмяЭлемента = "ПроверкаПодписиНадпись" Тогда
		Возврат НСтр("ru = 'Проверка созданной подписи'");
		
	ИначеЕсли ИмяЭлемента = "ШифрованиеНадпись" Тогда
		Возврат НСтр("ru = 'Шифрование данных'");
		
	ИначеЕсли ИмяЭлемента = "РасшифровкаНадпись" Тогда
		Возврат НСтр("ru = 'Расшифровка данных'");
	Иначе
		Возврат "";
	КонецЕсли;
	
КонецФункции

#КонецОбласти

&НаКлиенте
Процедура ДополнитьТекстОшибками(ТекстОшибок, Проверки, НаСервере = Ложь)
	
	СоставПроверок = ЭтотОбъект[?(НаСервере, "ПроверкиНаСервере", "ПроверкиНаКлиенте")];
	Для Каждого Проверка Из Проверки Цикл
		
		Если СоставПроверок = Неопределено Тогда
			ТекстОшибок = ТекстОшибок + Проверка + ": "
				+ НСтр("ru = 'Не выполнялась, так как не требуется (не настроено)'") + Символы.ПС;
		Иначе
			
			РезультатПроверки = ?(СоставПроверок.Свойство(Проверка),
				ПроверкиНаКлиенте[Проверка], Неопределено);
			
			ТекстОшибкиПроверки = ?(СоставПроверок.Свойство(Проверка + "Ошибка"),
				СокрЛП(ПроверкиНаКлиенте[Проверка + "Ошибка"]), "");
			
			ТекстОшибок = ТекстОшибок + Проверка + ": "
				+ ?(РезультатПроверки = Неопределено, НСтр("ru = 'Не выполнялась из-за предыдущих ошибок'"),
				Формат(РезультатПроверки, НСтр("ru = 'БЛ=Ошибка; БИ=Успех'")))
				+ ?(ПустаяСтрока(ТекстОшибкиПроверки), "", " """ + ТекстОшибкиПроверки + """") + Символы.ПС;
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ОшибкаПоКлассификатору(ОписаниеОшибки, ОшибкаНаСервере)
	
	Возврат ЭлектроннаяПодписьСлужебный.ОшибкаПоКлассификатору(ОписаниеОшибки, ОшибкаНаСервере);
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция СтандартныеПроверки()
	
	СтандартныеПроверки = Новый Массив;
	СтандартныеПроверки.Добавить("ЗаконныйСертификат");
	СтандартныеПроверки.Добавить("НаличиеСертификата");
	СтандартныеПроверки.Добавить("ДанныеСертификата");
	СтандартныеПроверки.Добавить("НаличиеПрограммы");
	СтандартныеПроверки.Добавить("Подписание");
	СтандартныеПроверки.Добавить("ПроверкаПодписи");
	СтандартныеПроверки.Добавить("Шифрование");
	СтандартныеПроверки.Добавить("Расшифровка");
	
	Возврат СтандартныеПроверки;
	
КонецФункции

&НаКлиенте
Функция ДополнительныеДанные(ИмяОшибки = Неопределено)
	
	ДополнительныеДанные = ЭлектроннаяПодписьСлужебныйКлиент.ДополнительныеДанныеДляКлассификатораОшибок();
	ДополнительныеДанные.Сертификат = Сертификат;
	ДополнительныеДанные.ДанныеСертификата = АдресСертификата;

	Если ИмяОшибки <> Неопределено Тогда
		ДополнительныеДанные.ДополнительныеДанныеПроверокНаКлиенте = 
			ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеДанныеПроверокНаКлиенте, ИмяОшибки, Неопределено);
		ДополнительныеДанные.ДополнительныеДанныеПроверокНаСервере =
			ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеДанныеПроверокНаСервере, ИмяОшибки, Неопределено);
	КонецЕсли;
	
	Возврат ДополнительныеДанные;
	
КонецФункции

&НаКлиенте
Асинх Функция ДополнительнаяПроверкаНаВозможностьПодписания(СертификатКриптографии, СторонаВыполнения)
	
	ОписаниеОшибки = "";
	
	Если Отозван Тогда
		ОшибкаСертификатПомеченКакОтозванный = ОшибкаСертификатПомеченКакОтозванный();
		ОписаниеОшибки = ОшибкаСертификатПомеченКакОтозванный.ТекстОшибки;
		УстановитьЭлемент(ЭтотОбъект, "Подписание", СторонаВыполнения, ОшибкаСертификатПомеченКакОтозванный, Истина, ОбъединятьРезультаты);
	Иначе
		
		РезультатПроверкиУдостоверяющегоЦентраСертификата = Ждать ЭлектроннаяПодписьСлужебныйКлиент.РезультатПроверкиУдостоверяющегоЦентраСертификата(СертификатКриптографии);
		
		Если Не РезультатПроверкиУдостоверяющегоЦентраСертификата.Действует Тогда
			
			ПодписаниеРазрешено = ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить(
				Сертификат, "РазрешитьПодписание", Неопределено);
		
			Если ПодписаниеРазрешено = Неопределено Или Не ПодписаниеРазрешено Тогда
				ОписаниеОшибки = РезультатПроверкиУдостоверяющегоЦентраСертификата.Предупреждение.ТекстОшибки;
				УстановитьЭлемент(ЭтотОбъект, "Подписание", СторонаВыполнения, РезультатПроверкиУдостоверяющегоЦентраСертификата.Предупреждение, Истина,
					ОбъединятьРезультаты);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Возврат ОписаниеОшибки;
	
КонецФункции

&НаСервереБезКонтекста
Функция ОшибкаСертификатПомеченКакОтозванный()
	
	Возврат ЭлектроннаяПодписьСлужебный.ОшибкаСертификатПомеченКакОтозванный()
	
КонецФункции 

&НаСервере
Процедура ОбновитьДанныеСертификата()
	
	СвойстваСертификата = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Сертификат,
		"Программа, ВводитьПарольВПрограммеЭлектроннойПодписи, Отозван");
	
	Отозван = СвойстваСертификата.Отозван;
	Программа = СвойстваСертификата.Программа;
	СертификатВводитьПарольВПрограммеЭлектроннойПодписи = СвойстваСертификата.ВводитьПарольВПрограммеЭлектроннойПодписи;

КонецПроцедуры

#КонецОбласти